From f4c55cc5f8cb7b74d6480d194b6da54883b39010 Mon Sep 17 00:00:00 2001 From: "lisai17@sina.com" Date: Fri, 7 Aug 2020 17:11:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 38 + build.bat | 7 + build.sh | 10 + ssjygl-xsx-common/pom.xml | 138 ++ .../src/main/java/com/cowr/common/Const.java | 15 + .../common/Interceptor/CorsInterceptor.java | 22 + .../Interceptor/ReporterInterceptor.java | 35 + .../com/cowr/common/base/BaseController.java | 73 + .../java/com/cowr/common/base/BaseModel.java | 121 ++ .../com/cowr/common/base/BaseService.java | 388 +++++ .../com/cowr/common/cache/RedisArpCache.java | 26 + .../com/cowr/common/ctrl/HomeController.java | 26 + .../java/com/cowr/common/enums/Enums.java | 89 + .../com/cowr/common/enums/OrderStateEnum.java | 68 + .../com/cowr/common/enums/OrderTypeEnum.java | 58 + .../com/cowr/common/enums/TruckRodState.java | 12 + .../com/cowr/common/enums/UserTypeEnum.java | 72 + .../cowr/common/handler/GlobalHandler.java | 28 + .../com/cowr/common/netty/JSONDecoder.java | 37 + .../com/cowr/common/netty/JSONEncoder.java | 28 + .../cowr/common/plugin/NettyServerPlugin.java | 93 ++ .../com/cowr/common/plugin/QuartzPlugin.java | 112 ++ .../common/plugin/SocketIOServerPlugin.java | 72 + .../common/serializer/CowrSerializer.java | 66 + .../java/com/cowr/common/utils/AESUtil.java | 94 ++ .../cowr/common/utils/ChineseNumberUtil.java | 198 +++ .../java/com/cowr/common/utils/DataUtil.java | 140 ++ .../com/cowr/common/utils/DateTimeUtil.java | 67 + .../java/com/cowr/common/utils/ImageUtil.java | 107 ++ .../java/com/cowr/common/utils/JsonUtil.java | 39 + .../java/com/cowr/common/utils/MathUtil.java | 55 + .../java/com/cowr/common/utils/ReqUtil.java | 34 + .../java/com/cowr/common/utils/StrUtil.java | 206 +++ .../common/validator/CrudParamValidator.java | 46 + .../common/validator/CustomerIdValidator.java | 22 + .../cowr/common/validator/DayValidator.java | 18 + .../cowr/common/validator/MonthValidator.java | 18 + .../cowr/common/validator/ParamValidator.java | 149 ++ .../cowr/common/validator/PhoneValidator.java | 27 + .../validator/StartAndEndTimeValidator.java | 19 + .../StartAndEndintervalValidator.java | 42 + .../cowr/common/validator/YearValidator.java | 18 + .../com/cowr/common/view/ActionReporter.java | 248 +++ .../com/cowr/common/view/ExcelRender.java | 74 + .../cowr/common/view/JsonRenderFactory.java | 19 + .../java/com/cowr/common/view/PageParam.java | 61 + .../cowr/common/view/ReportExcelStyle.java | 131 ++ .../java/com/cowr/common/view/Result.java | 224 +++ .../java/com/cowr/model/ActionCmdLog.java | 14 + .../main/java/com/cowr/model/AuthLicense.java | 14 + .../main/java/com/cowr/model/AuthResult.java | 31 + .../main/java/com/cowr/model/Blacklist.java | 14 + .../src/main/java/com/cowr/model/Bocomm.java | 14 + .../java/com/cowr/model/BocommRequest.java | 14 + .../java/com/cowr/model/BocommResponse.java | 14 + .../src/main/java/com/cowr/model/Cctv.java | 14 + .../java/com/cowr/model/CctvChannels.java | 14 + .../main/java/com/cowr/model/Customer.java | 14 + .../java/com/cowr/model/CustomerContact.java | 14 + .../java/com/cowr/model/CustomerReceiver.java | 14 + .../java/com/cowr/model/DeviceConfig.java | 14 + .../src/main/java/com/cowr/model/Driver.java | 14 + .../main/java/com/cowr/model/ModifyLog.java | 14 + .../java/com/cowr/model/OrderPurchase.java | 14 + .../main/java/com/cowr/model/OrderSale.java | 14 + .../main/java/com/cowr/model/OrderSeq.java | 14 + .../main/java/com/cowr/model/OrderTemp.java | 14 + .../java/com/cowr/model/OrderTransfer.java | 14 + .../main/java/com/cowr/model/OrderTrash.java | 15 + .../java/com/cowr/model/Ordercluster.java | 14 + .../com/cowr/model/PostLicenseResult.java | 66 + .../java/com/cowr/model/PrepayCustomer.java | 14 + .../java/com/cowr/model/PrepayDetail.java | 14 + .../cowr/model/PrepayDetailStateHistory.java | 15 + .../main/java/com/cowr/model/PrepayTruck.java | 14 + .../src/main/java/com/cowr/model/Product.java | 14 + .../main/java/com/cowr/model/Purchase.java | 14 + .../java/com/cowr/model/RefundDetail.java | 14 + .../cowr/model/RefundDetailStateHistory.java | 14 + .../main/java/com/cowr/model/Sandfarm.java | 14 + .../src/main/java/com/cowr/model/Stock.java | 14 + .../java/com/cowr/model/StockModifyLog.java | 14 + .../main/java/com/cowr/model/Supermarket.java | 14 + .../com/cowr/model/SupermarketProduct.java | 14 + .../model/SupermarketReceiverDistance.java | 14 + .../model/SupermarketSandfarmDistance.java | 15 + .../main/java/com/cowr/model/SyncTask.java | 63 + .../src/main/java/com/cowr/model/Sysuser.java | 14 + .../com/cowr/model/TransPriceConfigSale.java | 15 + .../cowr/model/TransPriceConfigTransfer.java | 15 + .../com/cowr/model/TransPriceConfigTrash.java | 15 + .../main/java/com/cowr/model/Transport.java | 14 + .../java/com/cowr/model/TransportCompany.java | 14 + .../src/main/java/com/cowr/model/Truck.java | 14 + .../main/java/com/cowr/model/_MappingKit.java | 72 + .../com/cowr/model/base/BaseActionCmdLog.java | 134 ++ .../com/cowr/model/base/BaseAuthLicense.java | 68 + .../com/cowr/model/base/BaseBlacklist.java | 270 ++++ .../java/com/cowr/model/base/BaseBocomm.java | 592 +++++++ .../cowr/model/base/BaseBocommRequest.java | 112 ++ .../cowr/model/base/BaseBocommResponse.java | 112 ++ .../java/com/cowr/model/base/BaseCctv.java | 222 +++ .../com/cowr/model/base/BaseCctvChannels.java | 134 ++ .../com/cowr/model/base/BaseCustomer.java | 266 +++ .../cowr/model/base/BaseCustomerContact.java | 111 ++ .../cowr/model/base/BaseCustomerReceiver.java | 221 +++ .../com/cowr/model/base/BaseDeviceConfig.java | 106 ++ .../java/com/cowr/model/base/BaseDriver.java | 156 ++ .../com/cowr/model/base/BaseModifyLog.java | 244 +++ .../cowr/model/base/BaseOrderPurchase.java | 676 ++++++++ .../com/cowr/model/base/BaseOrderSale.java | 1158 ++++++++++++++ .../com/cowr/model/base/BaseOrderSeq.java | 112 ++ .../com/cowr/model/base/BaseOrderTemp.java | 1028 ++++++++++++ .../cowr/model/base/BaseOrderTransfer.java | 654 ++++++++ .../com/cowr/model/base/BaseOrderTrash.java | 611 +++++++ .../com/cowr/model/base/BaseOrdercluster.java | 882 ++++++++++ .../cowr/model/base/BasePrepayCustomer.java | 199 +++ .../com/cowr/model/base/BasePrepayDetail.java | 338 ++++ .../base/BasePrepayDetailStateHistory.java | 179 +++ .../com/cowr/model/base/BasePrepayTruck.java | 222 +++ .../java/com/cowr/model/base/BaseProduct.java | 90 ++ .../com/cowr/model/base/BasePurchase.java | 244 +++ .../com/cowr/model/base/BaseRefundDetail.java | 318 ++++ .../base/BaseRefundDetailStateHistory.java | 178 ++ .../com/cowr/model/base/BaseSandfarm.java | 244 +++ .../java/com/cowr/model/base/BaseStock.java | 112 ++ .../cowr/model/base/BaseStockModifyLog.java | 200 +++ .../com/cowr/model/base/BaseSupermarket.java | 224 +++ .../model/base/BaseSupermarketProduct.java | 90 ++ .../base/BaseSupermarketReceiverDistance.java | 90 ++ .../base/BaseSupermarketSandfarmDistance.java | 91 ++ .../com/cowr/model/base/BaseSyncTask.java | 216 +++ .../java/com/cowr/model/base/BaseSysuser.java | 238 +++ .../model/base/BaseTransPriceConfigSale.java | 135 ++ .../base/BaseTransPriceConfigTransfer.java | 135 ++ .../model/base/BaseTransPriceConfigTrash.java | 135 ++ .../com/cowr/model/base/BaseTransport.java | 718 +++++++++ .../cowr/model/base/BaseTransportCompany.java | 310 ++++ .../java/com/cowr/model/base/BaseTruck.java | 310 ++++ .../main/java/com/cowr/ssjygl/CacheData.java | 23 + .../authlicense/AuthLicensePKValidator.java | 25 + .../authlicense/AuthLicenseService.java | 71 + .../authlicense/AuthLicenseValidator.java | 25 + .../blacklist/BlacklistPKValidator.java | 25 + .../ssjygl/blacklist/BlacklistService.java | 74 + .../ssjygl/blacklist/BlacklistValidator.java | 43 + .../com/cowr/ssjygl/cctv/CctvController.java | 21 + .../com/cowr/ssjygl/cctv/CctvService.java | 47 + .../ssjygl/customer/CustomerPKValidator.java | 25 + .../cowr/ssjygl/customer/CustomerService.java | 98 ++ .../ssjygl/customer/CustomerValidator.java | 44 + .../contact/CustomerContactPKValidator.java | 25 + .../contact/CustomerContactService.java | 79 + .../contact/CustomerContactValidator.java | 40 + .../receiver/CustomerReceiverPKValidator.java | 25 + .../receiver/CustomerReceiverService.java | 107 ++ .../receiver/CustomerReceiverValidator.java | 46 + .../cowr/ssjygl/driver/DriverPKValidator.java | 25 + .../com/cowr/ssjygl/driver/DriverService.java | 68 + .../cowr/ssjygl/driver/DriverValidator.java | 41 + .../ssjygl/modifylog/ModifyLogController.java | 40 + .../modifylog/ModifyLogPKValidator.java | 25 + .../ssjygl/modifylog/ModifyLogService.java | 137 ++ .../ssjygl/order/OrderCancelValidator.java | 20 + .../cowr/ssjygl/order/OrderSnValidator.java | 19 + .../ssjygl/order/OrderStateValidator.java | 28 + .../com/cowr/ssjygl/order/SnValidator.java | 19 + .../ordercluster/OrderclusterPKValidator.java | 25 + .../ordercluster/OrderclusterService.java | 309 ++++ .../ordercluster/OrderclusterValidator.java | 68 + .../OrderPurchasePKValidator.java | 25 + .../orderpurchase/OrderPurchaseService.java | 126 ++ .../order/ordersale/OrderSalePKValidator.java | 25 + .../order/ordersale/OrderSaleService.java | 155 ++ .../order/ordertemp/OrderTempPKValidator.java | 25 + .../order/ordertemp/OrderTempService.java | 136 ++ .../OrderTransferPKValidator.java | 25 + .../ordertransfer/OrderTransferService.java | 131 ++ .../ordertrash/OrderTrashPKValidator.java | 26 + .../order/ordertrash/OrderTrashService.java | 117 ++ .../cowr/ssjygl/prepay/PrepayController.java | 74 + .../com/cowr/ssjygl/prepay/PrepayService.java | 694 ++++++++ .../prepaycustomer/PrepayCustomerService.java | 11 + .../prepaydetail/PrepayDetailPKValidator.java | 23 + .../prepaydetail/PrepayDetailService.java | 281 ++++ .../prepaydetail/PrepayDetailValidator.java | 43 + .../PrepayDetailVerifyValidator.java | 32 + .../prepay/prepaytruck/DayValidator.java | 22 + .../prepaytruck/PrepayTruckPKValidator.java | 24 + .../prepaytruck/PrepayTruckService.java | 263 +++ .../prepaytruck/PrepayTruckValidator.java | 38 + .../RefundDetailConfirmValidator.java | 32 + .../refunddetail/RefundDetailPKValidator.java | 23 + .../refunddetail/RefundDetailService.java | 76 + .../refunddetail/RefundDetailValidator.java | 43 + .../RefundDetailVerifyValidator.java | 32 + .../ssjygl/product/ProductPKValidator.java | 24 + .../cowr/ssjygl/product/ProductService.java | 62 + .../cowr/ssjygl/product/ProductValidator.java | 36 + .../ssjygl/purchase/PurchasePKValidator.java | 24 + .../cowr/ssjygl/purchase/PurchaseService.java | 59 + .../ssjygl/purchase/PurchaseValidator.java | 43 + .../ssjygl/sandfarm/SandfarmPKValidator.java | 25 + .../cowr/ssjygl/sandfarm/SandfarmService.java | 59 + .../ssjygl/sandfarm/SandfarmValidator.java | 43 + .../purchase/OrderPurchaseStatController.java | 33 + .../purchase/OrderPurchaseStatService.java | 250 +++ .../ssjygl/stat/sale/OrderStatController.java | 276 ++++ .../ssjygl/stat/sale/OrderStatService.java | 1425 +++++++++++++++++ .../transfer/OrderTransferStatController.java | 33 + .../transfer/OrderTransferStatService.java | 234 +++ .../supermarket/SupermarketIdValidator.java | 23 + .../supermarket/SupermarketPKValidator.java | 25 + .../supermarket/SupermarketService.java | 132 ++ .../supermarket/SupermarketValidator.java | 43 + ...upermarketReceiverDistancePKValidator.java | 27 + .../SupermarketReceiverDistanceService.java | 172 ++ .../SupermarketReceiverDistanceValidator.java | 33 + ...upermarketSandfarmDistancePKValidator.java | 27 + .../SupermarketSandfarmDistanceService.java | 76 + .../SupermarketSandfarmDistanceValidator.java | 33 + .../supermarket/stock/StockPKValidator.java | 24 + .../supermarket/stock/StockService.java | 105 ++ .../supermarket/stock/StockValidator.java | 41 + .../system/sysuser/SysuserPKValidator.java | 24 + .../system/sysuser/SysuserValidator.java | 54 + .../ssjygl/transport/LicenseValidator.java | 23 + .../ssjygl/transport/PostWeightValidator.java | 19 + .../transport/TransportIdValidator.java | 16 + .../ssjygl/transport/TransportService.java | 175 ++ .../TransportCompanyPKValidator.java | 25 + .../TransportCompanyService.java | 80 + .../TransportCompanyValidator.java | 53 + .../transprice/CaleTransPriceValidator.java | 18 + .../transprice/TransPriceController.java | 45 + .../ssjygl/transprice/TransPriceModel.java | 72 + .../ssjygl/transprice/TransPriceService.java | 320 ++++ .../cowr/ssjygl/truck/TruckPKValidator.java | 25 + .../com/cowr/ssjygl/truck/TruckService.java | 106 ++ .../com/cowr/ssjygl/truck/TruckValidator.java | 51 + .../java/generator/BaseModelGenerator.java | 170 ++ .../src/main/java/generator/ColumnMeta.java | 54 + .../main/java/generator/CrudGenerator.java | 128 ++ .../generator/DataDictionaryGenerator.java | 202 +++ .../src/main/java/generator/Generator.java | 290 ++++ .../src/main/java/generator/Main.java | 108 ++ .../java/generator/MappingKitGenerator.java | 135 ++ .../src/main/java/generator/MetaBuilder.java | 518 ++++++ .../main/java/generator/ModelGenerator.java | 156 ++ .../src/main/java/generator/TableMeta.java | 51 + .../src/main/resources/db.properties | 4 + .../generator/base_model_template.jf | 97 ++ .../generator/controller_template.jf | 98 ++ .../generator/mapping_kit_template.jf | 32 + .../resources/generator/model_template.jf | 19 + .../generator/pkvalidator_template.jf | 33 + .../resources/generator/service_template.jf | 49 + .../resources/generator/validator_template.jf | 57 + ssjygl-xsx-local/build.sh | 8 + ssjygl-xsx-local/debug.sh | 6 + ssjygl-xsx-local/package.xml | 69 + ssjygl-xsx-local/pom.xml | 219 +++ .../actioncmdlog/ActionCmdLogController.java | 22 + .../actioncmdlog/ActionCmdLogPKValidator.java | 24 + .../actioncmdlog/ActionCmdLogService.java | 61 + .../authlicense/AuthLicenseController.java | 77 + .../authlicense/AuthLicenseSyncService.java | 205 +++ .../local/ssjygl/base/BaseSyncService.java | 148 ++ .../ssjygl/blacklist/BlacklistController.java | 97 ++ .../blacklist/BlacklistSyncService.java | 147 ++ .../local/ssjygl/cache/CacheController.java | 36 + .../ssjygl/customer/CustomerController.java | 66 + .../contact/CustomerContactController.java | 68 + .../receiver/CustomerReceiverController.java | 71 + .../local/ssjygl/devicectrl/common/Const.java | 6 + .../devicectrl/common/DeviceThread.java | 325 ++++ .../devicectrl/controllers/Controller.java | 453 ++++++ .../devicectrl/controllers/InController.java | 284 ++++ .../devicectrl/controllers/OutController.java | 281 ++++ .../ssjygl/devicectrl/device/AbsScale.java | 71 + .../ssjygl/devicectrl/device/Camera.java | 50 + .../devicectrl/device/CameraController.java | 118 ++ .../ssjygl/devicectrl/device/Device.java | 50 + .../devicectrl/device/HuangZhouScale.java | 125 ++ .../local/ssjygl/devicectrl/device/LED.java | 213 +++ .../local/ssjygl/devicectrl/device/PLC.java | 275 ++++ .../ssjygl/devicectrl/device/Printer.java | 76 + .../devicectrl/printer/CellAddresses.java | 117 ++ .../devicectrl/printer/ExcelHelper.java | 113 ++ .../local/ssjygl/devicectrl/utils/CRC16.java | 58 + .../devicectrl/utils/LicenseJPGPair.java | 13 + .../local/ssjygl/driver/DriverController.java | 67 + .../com/cowr/local/ssjygl/jobs/SyncJob.java | 18 + .../local/ssjygl/main/AuthInterceptor.java | 56 + .../cowr/local/ssjygl/main/CliCacheData.java | 20 + .../com/cowr/local/ssjygl/main/Config.java | 383 +++++ .../java/com/cowr/local/ssjygl/main/Main.java | 52 + .../local/ssjygl/netty/AbstractClient.java | 96 ++ .../com/cowr/local/ssjygl/netty/EndPoint.java | 17 + .../cowr/local/ssjygl/netty/NettyClient.java | 250 +++ .../local/ssjygl/netty/SocketIOService.java | 136 ++ .../cowr/local/ssjygl/order/OrderService.java | 489 ++++++ .../ordercluster/OrderclusterController.java | 59 + .../OrderPurchaseController.java | 98 ++ .../OrderPurchasePayValidator.java | 25 + .../OrderPurchaseSyncService.java | 241 +++ .../order/ordersale/OrderSaleController.java | 124 ++ .../ordersale/OrderSalePayValidator.java | 22 + .../order/ordersale/OrderSaleSyncService.java | 629 ++++++++ .../order/orderseq/OrderSeqService.java | 53 + .../order/ordertemp/OrderTempController.java | 135 ++ .../ordertemp/OrderTempPayValidator.java | 25 + .../ordertemp/OrderTempPrepayValidator.java | 27 + .../order/ordertemp/OrderTempSyncService.java | 735 +++++++++ .../OrderTransferController.java | 98 ++ .../OrderTransferPayValidator.java | 25 + .../OrderTransferSyncService.java | 254 +++ .../ordertrash/OrderTrashController.java | 96 ++ .../ordertrash/OrderTrashPayValidator.java | 20 + .../ordertrash/OrderTrashSyncService.java | 232 +++ .../prepaydetail/PrepayDetailController.java | 82 + .../prepay/prepaytruck/DayValidator.java | 22 + .../prepaytruck/PrepayTruckController.java | 156 ++ .../prepaytruck/PrepayTruckSyncService.java | 134 ++ .../prepaytruck/PrepayTruckValidator.java | 37 + .../refunddetail/RefundDetailController.java | 67 + .../ssjygl/product/ProductController.java | 65 + .../ssjygl/purchase/PurchaseController.java | 65 + .../ssjygl/sandfarm/SandfarmController.java | 65 + .../supermarket/SupermarketController.java | 64 + .../product/SupermarketProductService.java | 56 + ...SupermarketReceiverDistanceController.java | 79 + ...SupermarketSandfarmDistanceController.java | 66 + .../supermarket/stock/StockController.java | 53 + .../supermarket/stock/StockSyncService.java | 131 ++ .../ssjygl/synctask/SyncTaskService.java | 285 ++++ .../system/sysuser/SysuserController.java | 142 ++ .../ssjygl/system/sysuser/SysuserService.java | 570 +++++++ .../ssjygl/transport/CmdLicenseValidator.java | 18 + .../transport/ManualCreateValidator.java | 20 + .../transport/ManualWeightValidator.java | 20 + .../ssjygl/transport/PaySginValidator.java | 25 + .../ssjygl/transport/TransportController.java | 301 ++++ .../transport/TransportDeviceService.java | 280 ++++ .../transport/TransportQueryController.java | 141 ++ .../transport/TransportQueryService.java | 399 +++++ .../transport/TransportSyncService.java | 865 ++++++++++ .../TransportCompanyController.java | 65 + .../local/ssjygl/truck/TruckController.java | 70 + .../src/main/resources/dev/config.properties | 27 + .../src/main/resources/dev/db.properties | 11 + .../src/main/resources/dev/undertow.txt | 14 + .../src/main/resources/job.properties | 4 + .../src/main/resources/log4j.properties | 96 ++ .../src/main/resources/logging.properties | 13 + .../src/main/resources/prod/config.properties | 27 + .../src/main/resources/prod/db.properties | 11 + .../src/main/resources/prod/undertow.txt | 14 + ssjygl-xsx-local/src/main/resources/tpl.xlsx | Bin 0 -> 12558 bytes .../src/main/resources/tpl_完整版.xlsx | Bin 0 -> 13793 bytes .../src/main/webapp/WEB-INF/web.xml | 7 + ssjygl-xsx-local/src/main/webapp/index.html | 98 ++ ssjygl-xsx-local/src/main/webapp/index.jsp | 5 + ssjygl-xsx-local/start.bat | 40 + ssjygl-xsx-local/start.sh | 51 + ssjygl-xsx-service/build.sh | 8 + ssjygl-xsx-service/debug.sh | 6 + ssjygl-xsx-service/package.xml | 63 + ssjygl-xsx-service/pom.xml | 207 +++ .../authlicense/AuthLicenseSyncService.java | 163 ++ .../service/ssjygl/base/BaseSyncService.java | 148 ++ .../ssjygl/blacklist/BlacklistController.java | 97 ++ .../blacklist/BlacklistSyncService.java | 146 ++ .../service/ssjygl/cache/CacheController.java | 26 + .../ssjygl/customer/CustomerController.java | 133 ++ .../ssjygl/customer/CustomerSyncService.java | 7 + .../contact/CustomerContactController.java | 135 ++ .../contact/CustomerContactSyncService.java | 31 + .../receiver/CustomerReceiverController.java | 138 ++ .../receiver/CustomerReceiverSyncService.java | 31 + .../ssjygl/driver/DriverController.java | 134 ++ .../ssjygl/driver/DriverSyncService.java | 33 + .../com/cowr/service/ssjygl/jobs/SyncJob.java | 15 + .../service/ssjygl/main/AuthInterceptor.java | 56 + .../com/cowr/service/ssjygl/main/Config.java | 298 ++++ .../com/cowr/service/ssjygl/main/Main.java | 34 + .../service/ssjygl/main/SvrCacheData.java | 10 + .../service/ssjygl/netty/NettyServer.java | 256 +++ .../ordercluster/OrderclusterController.java | 112 ++ .../OrderclusterEditValidator.java | 50 + .../ordercluster/OrderclusterSyncService.java | 278 ++++ .../OrderPurchaseController.java | 35 + .../order/ordersale/OrderSaleController.java | 34 + .../order/ordertemp/OrderTempController.java | 33 + .../OrderTransferController.java | 35 + .../ordertrash/OrderTrashController.java | 34 + .../PrepayCustomerSyncService.java | 4 + .../prepaydetail/PrepayDetailController.java | 165 ++ .../prepaydetail/PrepayDetailSyncService.java | 208 +++ .../PrepayDetailVerifyValidator.java | 32 + .../prepaytruck/PrepayTruckController.java | 75 + .../RefundDetailConfirmValidator.java | 32 + .../refunddetail/RefundDetailController.java | 166 ++ .../refunddetail/RefundDetailSyncService.java | 310 ++++ .../RefundDetailVerifyValidator.java | 32 + .../ssjygl/product/ProductController.java | 132 ++ .../ssjygl/product/ProductSyncService.java | 14 + .../ssjygl/purchase/PurchaseController.java | 132 ++ .../ssjygl/purchase/PurchaseSyncService.java | 14 + .../ssjygl/sandfarm/SandfarmController.java | 132 ++ .../ssjygl/sandfarm/SandfarmSyncService.java | 17 + .../supermarket/SupAddProductValidator.java | 18 + .../SupRemoveProductValidator.java | 17 + .../supermarket/SupermarketController.java | 95 ++ .../supermarket/SupermarketSyncService.java | 151 ++ ...SupermarketReceiverDistanceController.java | 156 ++ ...upermarketReceiverDistanceSyncService.java | 56 + ...SupermarketSandfarmDistanceController.java | 134 ++ ...upermarketSandfarmDistanceSyncService.java | 25 + .../supermarket/stock/StockController.java | 32 + .../ssjygl/synctask/SyncTaskService.java | 302 ++++ .../system/sysuser/SysuserController.java | 142 ++ .../ssjygl/system/sysuser/SysuserService.java | 568 +++++++ .../TransportCompanyController.java | 132 ++ .../TransportCompanySyncService.java | 7 + .../service/ssjygl/truck/TruckController.java | 137 ++ .../ssjygl/truck/TruckSyncService.java | 188 +++ .../src/main/resources/dev/config.properties | 12 + .../src/main/resources/dev/db.properties | 11 + .../src/main/resources/dev/undertow.txt | 14 + .../src/main/resources/job.properties | 5 + .../src/main/resources/log4j.properties | 77 + .../src/main/resources/logging.properties | 13 + .../src/main/resources/prod/config.properties | 12 + .../src/main/resources/prod/db.properties | 11 + .../src/main/resources/prod/undertow.txt | 14 + .../src/main/webapp/WEB-INF/web.xml | 7 + ssjygl-xsx-service/src/main/webapp/index.jsp | 5 + ssjygl-xsx-service/start.bat | 40 + ssjygl-xsx-service/start.sh | 51 + 440 files changed, 48156 insertions(+) create mode 100644 .gitignore create mode 100644 build.bat create mode 100644 build.sh create mode 100644 ssjygl-xsx-common/pom.xml create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/Const.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/CorsInterceptor.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/ReporterInterceptor.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseModel.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/cache/RedisArpCache.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/ctrl/HomeController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderStateEnum.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderTypeEnum.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/enums/TruckRodState.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/enums/UserTypeEnum.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/handler/GlobalHandler.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONDecoder.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONEncoder.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/NettyServerPlugin.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/QuartzPlugin.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/SocketIOServerPlugin.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/serializer/CowrSerializer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/AESUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ChineseNumberUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DataUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DateTimeUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ImageUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/JsonUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/MathUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ReqUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/utils/StrUtil.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CrudParamValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CustomerIdValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/DayValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/MonthValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/ParamValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/PhoneValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndTimeValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndintervalValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/validator/YearValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/view/ActionReporter.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/view/ExcelRender.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/view/JsonRenderFactory.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/view/PageParam.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/view/ReportExcelStyle.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/ActionCmdLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/AuthLicense.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/AuthResult.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Blacklist.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Bocomm.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/BocommRequest.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/BocommResponse.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Cctv.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/CctvChannels.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Customer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerContact.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerReceiver.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/DeviceConfig.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Driver.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/ModifyLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/OrderPurchase.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSale.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSeq.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTemp.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTransfer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTrash.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Ordercluster.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/PostLicenseResult.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayCustomer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetail.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetailStateHistory.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayTruck.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Product.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Purchase.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetail.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetailStateHistory.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Sandfarm.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Stock.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/StockModifyLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Supermarket.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketProduct.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketReceiverDistance.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketSandfarmDistance.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Sysuser.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigSale.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTransfer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTrash.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Transport.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/TransportCompany.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/Truck.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseActionCmdLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseAuthLicense.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBlacklist.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocomm.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommRequest.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommResponse.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctv.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctvChannels.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerContact.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerReceiver.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDeviceConfig.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDriver.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseModifyLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderPurchase.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSeq.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTrash.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayCustomer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetail.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetailStateHistory.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayTruck.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseProduct.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePurchase.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetail.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetailStateHistory.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSandfarm.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStock.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStockModifyLog.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarket.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketProduct.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketReceiverDistance.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketSandfarmDistance.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSysuser.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigSale.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTransfer.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTrash.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransport.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransportCompany.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTruck.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/CacheData.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicensePKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderCancelValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderSnValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderStateValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/SnValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchasePKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchaseService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSalePKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSaleService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaycustomer/PrepayCustomerService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/DayValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchasePKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketIdValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistancePKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistancePKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/LicenseValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/PostWeightValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportIdValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/CaleTransPriceValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceController.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceModel.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckPKValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckService.java create mode 100644 ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckValidator.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/BaseModelGenerator.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/ColumnMeta.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/CrudGenerator.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/DataDictionaryGenerator.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/Generator.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/Main.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/MappingKitGenerator.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/MetaBuilder.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/ModelGenerator.java create mode 100644 ssjygl-xsx-common/src/main/java/generator/TableMeta.java create mode 100644 ssjygl-xsx-common/src/main/resources/db.properties create mode 100644 ssjygl-xsx-common/src/main/resources/generator/base_model_template.jf create mode 100644 ssjygl-xsx-common/src/main/resources/generator/controller_template.jf create mode 100644 ssjygl-xsx-common/src/main/resources/generator/mapping_kit_template.jf create mode 100644 ssjygl-xsx-common/src/main/resources/generator/model_template.jf create mode 100644 ssjygl-xsx-common/src/main/resources/generator/pkvalidator_template.jf create mode 100644 ssjygl-xsx-common/src/main/resources/generator/service_template.jf create mode 100644 ssjygl-xsx-common/src/main/resources/generator/validator_template.jf create mode 100644 ssjygl-xsx-local/build.sh create mode 100644 ssjygl-xsx-local/debug.sh create mode 100644 ssjygl-xsx-local/package.xml create mode 100644 ssjygl-xsx-local/pom.xml create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogPKValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/base/BaseSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/cache/CacheController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/CustomerController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/contact/CustomerContactController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/receiver/CustomerReceiverController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/Const.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/Controller.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/AbsScale.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Camera.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/CameraController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Device.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/HuangZhouScale.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LED.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Printer.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/CellAddresses.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/CRC16.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/LicenseJPGPair.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/driver/DriverController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/jobs/SyncJob.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/AuthInterceptor.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/CliCacheData.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/AbstractClient.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/EndPoint.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/SocketIOService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/OrderService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordercluster/OrderclusterController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchasePayValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSalePayValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderseq/OrderSeqService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPayValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPrepayValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashPayValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaydetail/PrepayDetailController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/DayValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/refunddetail/RefundDetailController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/product/ProductController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/purchase/PurchaseController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/sandfarm/SandfarmController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/SupermarketController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/product/SupermarketProductService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/CmdLicenseValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualCreateValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualWeightValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/PaySginValidator.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportDeviceService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transportcompany/TransportCompanyController.java create mode 100644 ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/truck/TruckController.java create mode 100644 ssjygl-xsx-local/src/main/resources/dev/config.properties create mode 100644 ssjygl-xsx-local/src/main/resources/dev/db.properties create mode 100644 ssjygl-xsx-local/src/main/resources/dev/undertow.txt create mode 100644 ssjygl-xsx-local/src/main/resources/job.properties create mode 100644 ssjygl-xsx-local/src/main/resources/log4j.properties create mode 100644 ssjygl-xsx-local/src/main/resources/logging.properties create mode 100644 ssjygl-xsx-local/src/main/resources/prod/config.properties create mode 100644 ssjygl-xsx-local/src/main/resources/prod/db.properties create mode 100644 ssjygl-xsx-local/src/main/resources/prod/undertow.txt create mode 100644 ssjygl-xsx-local/src/main/resources/tpl.xlsx create mode 100644 ssjygl-xsx-local/src/main/resources/tpl_完整版.xlsx create mode 100644 ssjygl-xsx-local/src/main/webapp/WEB-INF/web.xml create mode 100644 ssjygl-xsx-local/src/main/webapp/index.html create mode 100644 ssjygl-xsx-local/src/main/webapp/index.jsp create mode 100644 ssjygl-xsx-local/start.bat create mode 100644 ssjygl-xsx-local/start.sh create mode 100644 ssjygl-xsx-service/build.sh create mode 100644 ssjygl-xsx-service/debug.sh create mode 100644 ssjygl-xsx-service/package.xml create mode 100644 ssjygl-xsx-service/pom.xml create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/authlicense/AuthLicenseSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/base/BaseSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/SyncJob.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/SvrCacheData.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterEditValidator.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/orderpurchase/OrderPurchaseController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordersale/OrderSaleController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertransfer/OrderTransferController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertrash/OrderTrashController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaytruck/PrepayTruckController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupAddProductValidator.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupRemoveProductValidator.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceSyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/stock/StockController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanyController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanySyncService.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckController.java create mode 100644 ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java create mode 100644 ssjygl-xsx-service/src/main/resources/dev/config.properties create mode 100644 ssjygl-xsx-service/src/main/resources/dev/db.properties create mode 100644 ssjygl-xsx-service/src/main/resources/dev/undertow.txt create mode 100644 ssjygl-xsx-service/src/main/resources/job.properties create mode 100644 ssjygl-xsx-service/src/main/resources/log4j.properties create mode 100644 ssjygl-xsx-service/src/main/resources/logging.properties create mode 100644 ssjygl-xsx-service/src/main/resources/prod/config.properties create mode 100644 ssjygl-xsx-service/src/main/resources/prod/db.properties create mode 100644 ssjygl-xsx-service/src/main/resources/prod/undertow.txt create mode 100644 ssjygl-xsx-service/src/main/webapp/WEB-INF/web.xml create mode 100644 ssjygl-xsx-service/src/main/webapp/index.jsp create mode 100644 ssjygl-xsx-service/start.bat create mode 100644 ssjygl-xsx-service/start.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..60d4f11 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +.idea/ +*.iml +/ssjygl-xsx-common/target/ +/ssjygl-xsx-local/target/ +/ssjygl-xsx-service/target/ +/ssjygl-xsx-devicectrl/target/ + +/logs/ +/ssjygl-xsx-common/logs/ +/ssjygl-xsx-local/logs/ +/ssjygl-xsx-service/logs/ +/ssjygl-xsx-devicectrl/logs/ + +/ssjygl-xsx-common/out/ +/ssjygl-xsx-local/out/ +/ssjygl-xsx-service/out/ +/ssjygl-xsx-devicectrl/out/ + +/ssjygl-xsx-common/upload/ +/ssjygl-xsx-local/upload/ +/ssjygl-xsx-service/upload/ +/ssjygl-xsx-devicectrl/upload/ + +/ssjygl-xsx-common/.idea/ +/ssjygl-xsx-local/.idea/ +/ssjygl-xsx-service/.idea/ +/ssjygl-xsx-devicectrl/.idea/ + +/gern +/ssjygl-xsx-common/imgfile/ +/ssjygl-xsx-local/imgfile/ +/ssjygl-xsx-common/xlsfile/ +/ssjygl-xsx-local/xlsfile/ +/ssjygl-xsx-common/KHT_Log/ +/ssjygl-xsx-local/KHT_Log/ + +/ssjygl-xsx-local/lib/bocommjava/log +/ssjygl-xsx-local/src/main/webapp/upload \ No newline at end of file diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..e8db785 --- /dev/null +++ b/build.bat @@ -0,0 +1,7 @@ +cd ../ssjygl-xsx-local +start mvn clean package + +cd ../ssjygl-xsx-service +start mvn clean package + +cd .. \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..ef11fa9 --- /dev/null +++ b/build.sh @@ -0,0 +1,10 @@ +cd ssjygl-xsx-common +mvn clean package install + +cd ../ssjygl-xsx-local +mvn clean package + +cd ../ssjygl-xsx-service +mvn clean package + +cd .. \ No newline at end of file diff --git a/ssjygl-xsx-common/pom.xml b/ssjygl-xsx-common/pom.xml new file mode 100644 index 0000000..972d0af --- /dev/null +++ b/ssjygl-xsx-common/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + com.cowr.ssjygl-xsx-common + ssjygl-xsx-common + 1.0 + jar + + 砂石经营管理-浠水县-公用代码 + + + UTF-8 + 1.8 + 1.8 + + + + + + ali-maven + http://maven.aliyun.com/nexus/content/groups/public + + true + + + true + always + fail + + + + + + + + com.jfinal + jfinal + 4.9 + + + + com.alibaba + fastjson + 1.2.68 + provided + + + + net.coobird + thumbnailator + 0.4.11 + provided + + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + + org.apache.xmlbeans + xmlbeans + 3.1.0 + + + + org.apache.poi + poi-ooxml + 4.1.0 + + + + org.apache.poi + poi-ooxml-schemas + 4.1.0 + + + + org.apache.poi + ooxml-schemas + 1.4 + + + + eu.bitwalker + UserAgentUtils + 1.21 + provided + + + + org.quartz-scheduler + quartz + 2.3.2 + provided + + + + mysql + mysql-connector-java + 8.0.16 + runtime + + + + com.alibaba + druid + 1.1.22 + runtime + + + + com.corundumstudio.socketio + netty-socketio + 1.7.18 + provided + + + + com.google.zxing + core + 3.4.0 + + + + com.google.zxing + javase + 3.4.0 + + + + + \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/Const.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/Const.java new file mode 100644 index 0000000..c93ff12 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/Const.java @@ -0,0 +1,15 @@ +package com.cowr.common; + +public class Const { + public static final String DEFAULT_PASSWORD = "678910"; // 新建用户默认密码 + public static final String LOGIC_DEL_KEY = "del"; // 逻辑删除字段 + public static final int LOGIC_DEL_INVALID = 1; // 标记为逻辑删除 + public static final int LOGIC_DEL_VALID = 0; // 标记为有效数据 + public static final int DEFAULT_SN_LEN = 4; // 订单号结尾的序列号默认长度 + public static final int DEFAULT_SN_MAX = Double.valueOf(Math.pow(10, DEFAULT_SN_LEN) - 1).intValue(); // 订单号结尾的序列号默认最大值 + public static final String ORDER_BY_ASC = "asc"; // 正序 + public static final String ORDER_BY_DESC = "desc"; // 倒叙 + public static final String REDIS_SEPARATE = ":"; // reids 分隔符 + public static final String REDIS_CACHENAME = "mian"; // redis 默认 cache 对象别名 + public static final String REDIS_JSON = "json"; // redis 按 json 存储对象 +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/CorsInterceptor.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/CorsInterceptor.java new file mode 100644 index 0000000..0ef8d6c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/CorsInterceptor.java @@ -0,0 +1,22 @@ +package com.cowr.common.Interceptor; + +import com.jfinal.aop.Interceptor; +import com.jfinal.aop.Invocation; +import javax.servlet.http.HttpServletResponse; + +public class CorsInterceptor implements Interceptor { + @Override + public void intercept(Invocation inv) { + inv.invoke(); + addCorsHead(inv.getController().getResponse()); + } + + private void addCorsHead(HttpServletResponse response) { + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader( + "Access-Control-Allow-Headers", + "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/ReporterInterceptor.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/ReporterInterceptor.java new file mode 100644 index 0000000..a16746f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/Interceptor/ReporterInterceptor.java @@ -0,0 +1,35 @@ +package com.cowr.common.Interceptor; + +import com.cowr.common.view.ActionReporter; +import com.jfinal.aop.Interceptor; +import com.jfinal.aop.Invocation; +import com.jfinal.core.Controller; +import com.jfinal.core.JFinal; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +public class ReporterInterceptor implements Interceptor { + public static List exclude = new ArrayList() {{ + add("/camera/recv"); + add("/transport/query/real"); + add("/stock/get"); + add("/transport/query/inSupermarket"); + add("/overall/getCompleteOrder"); + add("/gps/real"); + }}; + + @Override + public void intercept(Invocation inv) { + Controller c = inv.getController(); + HttpServletRequest request = c.getRequest(); + String target = request.getRequestURI(); + + if (!exclude.contains(target)) { + ActionReporter.report(target, c, JFinal.me().getAction(target, new String[]{c.getPara()})); + } + + inv.invoke(); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseController.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseController.java new file mode 100644 index 0000000..a29446c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseController.java @@ -0,0 +1,73 @@ +package com.cowr.common.base; + +import com.cowr.common.view.Result; +import com.jfinal.core.ActionException; +import com.jfinal.core.Controller; +import com.jfinal.core.NotAction; +import com.jfinal.kit.StrKit; +import com.jfinal.render.RenderManager; + +public abstract class BaseController extends Controller { + private static final RenderManager renderManager = RenderManager.me(); + + public String getUpperCaseVal(String name) { + String value = get(name); + + if (StrKit.notBlank(value)) { + value = value.toUpperCase(); + } + + return value; + } + + /** + * 获取字符串值后转为大写 + * + * @param name + * @param defaultValue + * @return + */ + public String getUpperCaseVal(String name, String defaultValue) { + String value = get(name, defaultValue); + + if (StrKit.notBlank(value)) { + value = value.toUpperCase(); + } + + return value; + } + + private Double toDouble(String value, Double defaultValue) { + try { + if (StrKit.isBlank(value)) + return defaultValue; + value = value.trim(); + if (value.startsWith("N") || value.startsWith("n")) + return -Double.parseDouble(value.substring(1)); + return Double.parseDouble(value); + } + catch (Exception e) { + throw new ActionException(400, renderManager.getRenderFactory().getErrorRender(400), "Can not parse the parameter \"" + value + "\" to Double value."); + } + } + + @NotAction + public Double getParaToDouble(String name) { + return toDouble(getPara(name), null); + } + + @NotAction + public Double getParaToDouble(String name, Double defaultValue) { + return toDouble(getPara(name), defaultValue); + } + + public void renderJsonp(Result json){ + String callback = get("callback"); + + if(StrKit.notBlank(callback)) { + renderJavascript(callback + "(" + json.toJSONString() + ");"); + }else{ + renderJson(json); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseModel.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseModel.java new file mode 100644 index 0000000..973feba --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseModel.java @@ -0,0 +1,121 @@ +package com.cowr.common.base; + +import com.alibaba.fastjson.annotation.JSONField; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.IBean; +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.Table; +import com.cowr.common.Const; +import com.cowr.common.utils.StrUtil; + +public abstract class BaseModel> extends Model implements IBean { + private static final Log log = Log.getLog(BaseModel.class); + private static final String tablename = ""; + + public String getTablename() { + return tablename; + } + + /** + * 判断是否存在该字段 + * + * @param colunm + * @return + */ + public boolean hasColunm(String colunm) { + return _getTable().getColumnTypeMap().containsKey(colunm); + } + + /** + * 判断是否有 del 字段 + * + * @return + */ + public boolean hasDelKey() { + return hasColunm(Const.LOGIC_DEL_KEY); + } + + @JSONField(serialize = false) + public String[] getPKey() { + return _getTable().getPrimaryKey(); + } + + /** + * 按主键查找 + * + * @return + */ + public M findByPk() { + Table table = _getTable(); + String[] pKeys = table.getPrimaryKey(); + + if (pKeys == null) { + log.debug(table.getName() + " 未找到主键字段"); + pKeys = new String[0]; + } + Object[] vals = new Object[pKeys.length]; + + for (int i = 0; i < pKeys.length; i++) { + vals[i] = get(pKeys[i]); + } + + if (vals.length == 1) { + return findById(vals[0]); + } else { + return findByIds(vals); + } + } + + /** + * 按主键检查是否存在 + * + * @return boolean + */ + public boolean checkExistsByPk() { + return findByPk() != null; + } + + /** + * 按字段查询 model + * + * @param columns + * @return + */ + public M findByColumns(String... columns) { + Object[] vals = new Object[columns.length]; + + for (int i = 0; i < columns.length; i++) { + vals[i] = get(columns[i]); + } + String sql = StrUtil.findFirstByColumnsSql(_getTable().getName(), columns); + return findFirst(sql, vals); + } + + /** + * 按字段查询对象是否存在 + * + * @param columns + * @return + */ + public boolean checkDuplicate(String... columns) { + return findByColumns(columns) != null; + } + + /** + * 浅拷贝 + * + * @return + */ + public M clone() { + try { + Model ar = this.getClass().newInstance(); + ar._setAttrs(this._getAttrs()); + + return (M) ar; + } catch (InstantiationException | IllegalAccessException e) { + log.error(e.getMessage(), e); + } + + return null; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseService.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseService.java new file mode 100644 index 0000000..8815295 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/base/BaseService.java @@ -0,0 +1,388 @@ +package com.cowr.common.base; + +import com.cowr.common.enums.Enums; +import com.cowr.common.utils.StrUtil; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Model; +import com.cowr.common.Const; +import com.cowr.common.view.Result; + +import java.sql.SQLException; +import java.util.Arrays; +import java.util.List; + +public class BaseService { + private static Log log = Log.getLog(BaseService.class); + + /** + * 按主键检查是否存在 + * + * @param model BaseModel + * @return Result + */ + public Result checkExistsByPk(BaseModel model) { + return Result.success(model.checkExistsByPk()); + } + + /** + * 按指定字段重复性检查 + * + * @param model + * @param columns + * @return + */ + public Result checkDuplicate(BaseModel model, String... columns) { + return Result.success(model.checkDuplicate(columns)); + } + + /** + * 先检查是否有重复的 + * + * @param model + * @param columns + * @return + */ + public Result save(BaseModel model, String... columns) { + if (model.checkDuplicate(columns)) { + return Result.failed(false, StrUtil.join(Arrays.asList(columns), ",") + " 数据重复"); + } else { + return save(model); + } + } + + public Result save(BaseModel model, Sysuser sysuser, String... columns) { + if (model.checkDuplicate(columns)) { + return Result.failed(false, StrUtil.join(Arrays.asList(columns), ",") + " 数据重复"); + } else { + return save(model, sysuser); + } + } + + /** + * 保存,并记录保存日志 + * + * @param model + * @param sysuser + * @return + */ + public Result save(BaseModel model, Sysuser sysuser) { + try { + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.save(); + + if (ret) { + ret = ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), sysuser); + } + + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 新增 + * + * @param model BaseModel + * @return Result + */ + public Result save(BaseModel model) { + try { + boolean ret = model.save(); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 删除 + * + * @param model BaseModel + * @return Result + */ + public Result delete(BaseModel model) { + try { + // 如果存在逻辑删除字段 del,则只做逻辑删除,不做物理删除 + if (model.hasDelKey()) { + return logicDel(model); + } + + // 注意这里有 !,找到后才做 delete 操作 + if (!model.checkExistsByPk()) { + return Result.failed(false, "按主键未找到对应记录"); + } + + return Result.object(model.delete()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + /** + * 删除 + * + * @param model BaseModel + * @return Result + */ + public Result delete(BaseModel model, Sysuser sysuser) { + try { + // 如果存在逻辑删除字段 del,则只做逻辑删除,不做物理删除 + if (model.hasDelKey()) { + return logicDel(model, sysuser); + } + + // 注意这里有 !,找到后才做 delete 操作 + if (!model.checkExistsByPk()) { + return Result.failed(false, "按主键未找到对应记录"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try{ + boolean ret = model.delete(); + + if (ret) { + ret = ModifyLogService.me.save(model, (BaseModel) model.findByPk(), Enums.DataOpType.DELETE.getId(), sysuser); + } + + return ret; + }catch (Exception e){ + log.error(e.getMessage(), e); + return false; + } + } + }); + + return Result.object(ret); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + /** + * 逻辑删除 + * + * @param model + * @return + */ + public Result logicDel(BaseModel model) { + try { + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_INVALID); // 逻辑删除字段统一用 del + + return update(model); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + /** + * 逻辑删除 + * + * @param model + * @return + */ + public Result logicDel(BaseModel model, Sysuser sysuser) { + try { + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_INVALID); // 逻辑删除字段统一用 del + + return update(model, sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + /** + * 恢复被逻辑删除的数据 + * + * @param model + * @return + */ + public Result restore(BaseModel model) { + try { + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_VALID); // 逻辑删除字段统一用 del + + return update(model); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "恢复失败"); + } + } + + /** + * 恢复被逻辑删除的数据 + * + * @param model + * @return + */ + public Result restore(BaseModel model, Sysuser sysuser) { + try { + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_VALID); // 逻辑删除字段统一用 del + + return update(model, sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "恢复失败"); + } + } + + /** + * 修改 + * + * @param model BaseModel + * @return Result + */ + public Result update(BaseModel model) { + try { + // 注意这里有 !,找到后才做 update 操作 + BaseModel oldobj = (BaseModel) model.findByPk(); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + boolean ret = model.update(); + + // 将修改后的对象返回 + String[] keys = model._getAttrNames(); + for (String key : keys) { + oldobj.set(key, model.get(key)); + } + + return ret ? Result.object(oldobj) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "修改失败"); + } + } + + /** + * 修改 + * + * @param model BaseModel + * @return Result + */ + public Result update(BaseModel model, Sysuser sysuser) { + try { + // 注意这里有 !,找到后才做 update 操作 + BaseModel oldobj = (BaseModel) model.findByPk(); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try{ + boolean ret = model.update(); + + if (ret) { + ret = ModifyLogService.me.save(model, oldobj, Enums.DataOpType.UPDATE.getId(), sysuser); + } + + return ret; + }catch (Exception e){ + log.error(e.getMessage(), e); + return false; + } + } + }); + + // 将修改后的对象返回 + String[] keys = model._getAttrNames(); + for (String key : keys) { + oldobj.set(key, model.get(key)); + } + + return ret ? Result.object(oldobj) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "修改失败"); + } + } + + /** + * 按主键查单个对象 + * + * @param model BaseModel + * @return Result + */ + public Result findByPk(BaseModel model) { + return Result.object(model.findByPk(), "按主键未找到记录"); + } + + /** + * 批量保存 + * + * @param list ? extends Model + * @return + */ + public Result batchSave(List list) { + try { + boolean flag = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + int[] ret = Db.batchSave(list, list.size()); + return true; + } + }); + + return Result.object(flag); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/cache/RedisArpCache.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/cache/RedisArpCache.java new file mode 100644 index 0000000..503e609 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/cache/RedisArpCache.java @@ -0,0 +1,26 @@ +package com.cowr.common.cache; + +import com.jfinal.plugin.activerecord.cache.ICache; +import com.jfinal.plugin.redis.Redis; + +public class RedisArpCache implements ICache { + @Override + public T get(String cacheName, Object key) { + return Redis.use(cacheName).get(key); + } + + @Override + public void put(String cacheName, Object key, Object value) { + Redis.use(cacheName).set(key, value); + } + + @Override + public void remove(String cacheName, Object key) { + Redis.use(cacheName).del(key); + } + + @Override + public void removeAll(String cacheName) { + + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/ctrl/HomeController.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/ctrl/HomeController.java new file mode 100644 index 0000000..91f400d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/ctrl/HomeController.java @@ -0,0 +1,26 @@ +package com.cowr.common.ctrl; + +import com.jfinal.core.Controller; +import com.jfinal.kit.HttpKit; +import com.jfinal.upload.UploadFile; + +/** + * 项目启动测试路由 + */ +public class HomeController extends Controller { + public void index() { + renderJson("ret", "接口联通测试"); + } + + public void img() { + try { + String data = HttpKit.readData(getRequest()); + + System.out.println(data); + } catch (Exception e) { + e.printStackTrace(); + } + + renderJson("ret", true); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java new file mode 100644 index 0000000..c230e8b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/Enums.java @@ -0,0 +1,89 @@ +package com.cowr.common.enums; + +import com.jfinal.kit.StrKit; + +public interface Enums { + enum MsgTarget { + LOGIN, // 注册 + HEARTBEAT, // 心跳 + HEARTBEATREPLY, // 心跳回复 + SYNCTASK, // 数据同步 + SYNCRECV, // 数据同步反馈 + } + + /** + * 数据操作类型 + */ + enum DataOpType { + SAVE(1), // 新增 + UPDATE(2), // 修改 + DELETE(3); // 删除 + + int id; + + DataOpType(int id) { + this.id = id; + } + + public int getId() { + return id; + } + } + + /** + * 控制流程 + */ + enum CtrlFlowEnum { + R, // 入场(兼容同一个磅有两个摄像头) + C, // 出场(兼容同一个磅有两个摄像头) + T; // 一个磅,一个摄像头,,即可以进,也可以出 + + /** + * 判断 which 是否有效 + * 以枚举 name 开头的是有效的 + * @param which + * @return + */ + public static boolean isValid(String which){ + if(StrKit.isBlank(which)){ + return false; + } + + for(CtrlFlowEnum ctrl : CtrlFlowEnum.values()){ + if(which.startsWith(ctrl.name())){ + return true; + } + } + + return false; + } + } + + /** + * 出入场控制 which + */ + enum WhichEnum{ + R01, // 入场 01 + C01, // 出场 01 + } + + enum RowEnum{ + FRONT(1), + BACK(2); + + int id; + + RowEnum(int id){ + this.id = id; + } + + public int getId() { + return id; + } + } + + enum PrinterIdEnum { + printer1, + printer2, + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderStateEnum.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderStateEnum.java new file mode 100644 index 0000000..97dd919 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderStateEnum.java @@ -0,0 +1,68 @@ +package com.cowr.common.enums; + +import java.util.ArrayList; +import java.util.List; + +/** + 订单状态类型必须是一致 + 1,初始状态; + 2,已进场;(后台自动设置) + 3,已装载 + 4,已离场(后台自动设置) + 5,已收货 + 9,订单作废 + */ +public enum OrderStateEnum { + INITIAL(1), + ENTERED(2), + LOADED(3), + LEAVE(4), + RECEIVED(5), + INVALID(9); + + OrderStateEnum(int stateid) { + this.stateid = stateid; + } + + private int stateid; + + public int getStateid() { + return stateid; + } + + public void setStateid(int stateid) { + this.stateid = stateid; + } + + /** + * 判断 stateid 是否合法 + * @param stateid + * @return + */ + public static boolean hasStateId(int stateid){ + for(OrderStateEnum stateEnum : OrderStateEnum.values()){ + if(stateEnum.stateid == OrderStateEnum.INITIAL.getStateid()){ // state == 1 是后端在添加订单时设置的 + continue; + } + + if(stateEnum.stateid == stateid){ + return true; + } + } + + return false; + } + + public static List getStateIdArr(){ + List list = new ArrayList<>(); + for(OrderStateEnum stateEnum : OrderStateEnum.values()){ + if(stateEnum.stateid == OrderStateEnum.INITIAL.getStateid()){ + continue; + } + + list.add(stateEnum.getStateid()); + } + + return list; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderTypeEnum.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderTypeEnum.java new file mode 100644 index 0000000..b01b893 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/OrderTypeEnum.java @@ -0,0 +1,58 @@ +package com.cowr.common.enums; + +import java.util.ArrayList; +import java.util.List; + +/** + 销售订单状态和转运订单状态类型必须是一致 + 1,销售订单 + 2,转运订单 + 3,临时订单(外销订单) + 4. 废料运输订单 + 5. 采购订单 + */ +public enum OrderTypeEnum { + SALE(1), + TRANSFER(2), + TEMP(3), + TRASH(4), + PURCHASE(5); + + OrderTypeEnum(int typeid) { + this.typeid = typeid; + } + + private int typeid; + + public int getTypeid() { + return typeid; + } + + public void setTypeid(int typeid) { + this.typeid = typeid; + } + + /** + * 判断 typeid 是否合法 + * @param typeid + * @return + */ + public static boolean hasStateId(int typeid){ + for(OrderTypeEnum stateEnum : OrderTypeEnum.values()){ + if(stateEnum.typeid == typeid){ + return true; + } + } + + return false; + } + + public static List getTypeIdArr(){ + List list = new ArrayList<>(); + for(OrderTypeEnum stateEnum : OrderTypeEnum.values()){ + list.add(stateEnum.getTypeid()); + } + + return list; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/TruckRodState.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/TruckRodState.java new file mode 100644 index 0000000..24e19cc --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/TruckRodState.java @@ -0,0 +1,12 @@ +package com.cowr.common.enums; + +/** + * 车辆入场状态 + * + */ +public class TruckRodState { + public static final int state_1 = 1; // 未在系统中登记的车牌,未入场。红色。 + public static final int state_2 = 2; // 已在系统中登记的车牌,未入场。绿色。 + public static final int state_3 = 3; // 正在入场(已抬杆,但没有入场称重)。黄色。 + public static final int state_4 = 4; // 已入场(有入场称重)。灰色。 +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/UserTypeEnum.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/UserTypeEnum.java new file mode 100644 index 0000000..b79757a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/enums/UserTypeEnum.java @@ -0,0 +1,72 @@ +package com.cowr.common.enums; + +import java.util.ArrayList; +import java.util.List; + +/** + type 和 role 对应,每类 type 下还会对应多个 role + 1,超市用户 + 负责具体某个超市相关操作的用户需要关联某个超市 + 2,物流公司用户 + 需要关联物流公司 + 3,用户开放注册时的用户注册,可以审核关联客户表信息,否则就是个人用户不进行customer关联 + 修改操作不允许修改此字段 + 4. 司机 + 5. 砂石公司用户,可以查看管理全部超市情况 + */ +public enum UserTypeEnum { + CONFIG(0), // 系统配置管理 + SUPERMARKET(1), + TRANSCO(2), + CUSTOMER(3), + DRIVER(4), + LEAD(5); // 砂石公司领导 + + private Integer typeid; + + public Integer getTypeid() { + return typeid; + } + + public void setTypeid(Integer typeid) { + this.typeid = typeid; + } + + UserTypeEnum(Integer typeid){ + this.typeid = typeid; + } + + public static UserTypeEnum getUserType(Integer typeid){ + for( UserTypeEnum t :UserTypeEnum.values()){ + if(t.typeid == typeid){ + return t; + } + } + + return null; + } + + /** + * 判断 typeid 是否合法 + * @param typeid + * @return + */ + public static boolean hasTypeId(Integer typeid){ + for(UserTypeEnum t :UserTypeEnum.values()){ + if(t.typeid == typeid){ + return true; + } + } + + return false; + } + + public static List getTypeIdArr(){ + List list = new ArrayList<>(); + for(UserTypeEnum t :UserTypeEnum.values()){ + list.add(t.getTypeid()); + } + + return list; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/handler/GlobalHandler.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/handler/GlobalHandler.java new file mode 100644 index 0000000..429afb0 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/handler/GlobalHandler.java @@ -0,0 +1,28 @@ +package com.cowr.common.handler; + +import com.jfinal.handler.Handler; +import com.jfinal.log.Log; +import com.cowr.common.Interceptor.ReporterInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created by lisai on 03/22. + * 全局过滤器 + */ +public class GlobalHandler extends Handler { + private static Log log = Log.getLog(GlobalHandler.class); + + @Override + public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { + long starttime = System.currentTimeMillis(); + + next.handle(target, request, response, isHandled); + + if (!ReporterInterceptor.exclude.contains(target)) { + log.debug("req [" + target + "] time -> " + (System.currentTimeMillis() - starttime) + " ms"); + } + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONDecoder.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONDecoder.java new file mode 100644 index 0000000..7255b39 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONDecoder.java @@ -0,0 +1,37 @@ +package com.cowr.common.netty; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class JSONDecoder extends ByteToMessageDecoder { + + //目标对象类型进行解码 + private Class target; + + public JSONDecoder(Class target) { + this.target = target; + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { + if (in.readableBytes() < 4) { //不够长度丢弃 + return; + } + in.markReaderIndex(); //标记一下当前的readIndex的位置 + int dataLength = in.readInt(); // 读取传送过来的消息的长度。ByteBuf 的readInt()方法会让他的readIndex增加4 + + if (in.readableBytes() < dataLength) { //读到的消息体长度如果小于我们传送过来的消息长度,则resetReaderIndex. 这个配合markReaderIndex使用的。把readIndex重置到mark的地方 + in.resetReaderIndex(); + return; + } + byte[] data = new byte[dataLength]; + in.readBytes(data); + + Object obj = JSON.parseObject(data, target); //将byte数据转化为我们需要的对象 + out.add(obj); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONEncoder.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONEncoder.java new file mode 100644 index 0000000..d0d2e88 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/netty/JSONEncoder.java @@ -0,0 +1,28 @@ +package com.cowr.common.netty; + +import com.alibaba.fastjson.JSON; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +public class JSONEncoder extends MessageToByteEncoder { + + //目标对象类型进行编码 + private Class target; + + public JSONEncoder(Class target) { + this.target = target; + } + + @Override + protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { + if (target.isInstance(msg)) { + byte[] data = JSON.toJSONBytes(msg); //使用fastJson将对象转换为byte + out.writeInt(data.length); //先将消息长度写入,也就是消息头 + out.writeBytes(data); //消息体中包含我们要发送的数据 + }else{ + System.out.println("encode instance error: " + msg.getClass()); + } + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/NettyServerPlugin.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/NettyServerPlugin.java new file mode 100644 index 0000000..249c007 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/NettyServerPlugin.java @@ -0,0 +1,93 @@ +package com.cowr.common.plugin; + +import com.jfinal.log.Log; +import com.jfinal.plugin.IPlugin; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LineBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.util.CharsetUtil; + +import java.util.HashMap; +import java.util.Map; + +public class NettyServerPlugin implements IPlugin { + private static Log log = Log.getLog(NettyServerPlugin.class); + private int port; + private Map map = new HashMap<>(); + private ServerBootstrap serverBootstrap; + private EventLoopGroup workerGroup; + private EventLoopGroup bossGroup; + + public NettyServerPlugin(int port){ + this.port = port; + } + + @Override + public boolean start() { + bossGroup = new NioEventLoopGroup(); + workerGroup = new NioEventLoopGroup(); + try { + serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast( + new IdleStateHandler(5, 5, 5), + new StringEncoder(CharsetUtil.UTF_8), + new LineBasedFrameDecoder(4096), + new StringDecoder(CharsetUtil.UTF_8), + new MsgHandler() + ); + } + }) + .option(ChannelOption.SO_BACKLOG, 128) + .childOption(ChannelOption.SO_KEEPALIVE, true); + + // Bind and start to accept incoming connections. + ChannelFuture f = serverBootstrap.bind(port); +// f.addListener((ChannelFutureListener) future -> { +// if (!future.isSuccess()) { +// map.remove(f.channel()); +// } +// }); + f.sync(); + f.channel().closeFuture().sync(); + + return true; + } catch (InterruptedException e) { + log.error(e.getMessage(), e); + + return false; + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } + + @Override + public boolean stop() { + if (serverBootstrap != null) { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + serverBootstrap = null; + } + + return true; + } + + + private static class MsgHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception { + + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/QuartzPlugin.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/QuartzPlugin.java new file mode 100644 index 0000000..9efd55d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/QuartzPlugin.java @@ -0,0 +1,112 @@ +package com.cowr.common.plugin; + +import com.jfinal.plugin.IPlugin; +import org.quartz.*; +import org.quartz.impl.StdSchedulerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.Enumeration; +import java.util.Properties; + +import static org.quartz.CronScheduleBuilder.cronSchedule; +import static org.quartz.JobBuilder.newJob; +import static org.quartz.TriggerBuilder.newTrigger; + + +/** + * Created by lisai on 2015/5/27. + */ +public class QuartzPlugin implements IPlugin { + private SchedulerFactory sf = null; + private Scheduler sched = null; + private String config = "job.properties"; + private Properties properties; + + public QuartzPlugin(String config) { + this.config = config; + } + + public QuartzPlugin() { + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public boolean start() { + sf = new StdSchedulerFactory(); + try { + sched = sf.getScheduler(); + } catch (SchedulerException e) { + new RuntimeException(e); + } + loadProperties(); + Enumeration enums = properties.keys(); + while (enums.hasMoreElements()) { + String key = enums.nextElement() + ""; + if (!key.endsWith("job")) { + continue; + } + String cronKey = key.substring(0, key.indexOf("job")) + "cron"; + String enable = key.substring(0, key.indexOf("job")) + "enable"; + if (isDisableJob(enable)) { + continue; + } + String jobClassName = properties.get(key) + ""; + String jobCronExp = properties.getProperty(cronKey) + ""; + Class clazz; + try { + clazz = Class.forName(jobClassName); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + JobDetail job = newJob(clazz).withIdentity(jobClassName, + jobClassName).build(); + CronTrigger trigger = newTrigger() + .withIdentity(jobClassName, jobClassName) + .withSchedule(cronSchedule(jobCronExp)).build(); + Date ft = null; + try { + ft = sched.scheduleJob(job, trigger); + sched.start(); + } catch (SchedulerException ee) { + new RuntimeException(ee); + } + System.out.println(job.getKey() + " has been scheduled to run at: " + ft + + " and repeat based on expression: " + + trigger.getCronExpression()); + } + return true ; + } + + private boolean isDisableJob(String enable) { + return Boolean.valueOf(properties.get(enable) + "") == false; + } + + private void loadProperties() { + properties = new Properties(); + InputStream is = QuartzPlugin.class.getClassLoader() + .getResourceAsStream(config); + try { + properties.load(is); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public boolean stop() { + try { + sched.shutdown(); + } catch (SchedulerException e) { + e.printStackTrace(); + return false; + } + return true; + } + + public static void main(String[]args) { + QuartzPlugin plugin = new QuartzPlugin(); + plugin.start(); + System.out.println("执行成功!!!"); + + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/SocketIOServerPlugin.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/SocketIOServerPlugin.java new file mode 100644 index 0000000..d22cb95 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/plugin/SocketIOServerPlugin.java @@ -0,0 +1,72 @@ +package com.cowr.common.plugin; + +import com.alibaba.fastjson.JSONObject; +import com.corundumstudio.socketio.Configuration; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.listener.ConnectListener; +import com.corundumstudio.socketio.listener.DataListener; +import com.corundumstudio.socketio.listener.DisconnectListener; +import com.jfinal.plugin.IPlugin; +import com.jfinal.plugin.activerecord.Record; +import org.apache.poi.ss.formula.functions.T; + +public class SocketIOServerPlugin implements IPlugin { + private int port; + private SocketIOServer server; + + public SocketIOServerPlugin(int port) { + this.port = port; + } + + public void pub(String channel, Record params){ + if(server != null) { + server.getBroadcastOperations().sendEvent(channel, params); + } + } + + public void pub(String channel, JSONObject params){ + if(server != null) { + server.getBroadcastOperations().sendEvent(channel, params); + } + } + + @Override + public boolean start() { + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(port); + + server = new SocketIOServer(config); + server.start(); + + return true; + } + + @Override + public boolean stop() { + if(server != null){ + server.stop(); + } + + return true; + } + + public void addEventListener(String eventName, Class eventClass, DataListener listener){ + if(server != null) { + server.addEventListener(eventName, eventClass, listener); + } + } + + public void addConnectListener(ConnectListener listener){ + if(server != null){ + server.addConnectListener(listener); + } + } + + public void addDisconnectListener(DisconnectListener listener){ + if(server != null){ + server.addDisconnectListener(listener); + } + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/serializer/CowrSerializer.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/serializer/CowrSerializer.java new file mode 100644 index 0000000..4d50231 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/serializer/CowrSerializer.java @@ -0,0 +1,66 @@ +package com.cowr.common.serializer; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializeConfig; +import com.jfinal.log.Log; +import com.jfinal.plugin.redis.serializer.ISerializer; + +/** + * Created by lisai on 16/12/17. + */ +public class CowrSerializer implements ISerializer { + private static Log log = Log.getLog(CowrSerializer.class); + public static final ISerializer me = new CowrSerializer(); + + @Override + public byte[] keyToBytes(String key) { + return key.getBytes(); + } + + @Override + public String keyFromBytes(byte[] bytes) { + return new String(bytes); + } + + @Override + public byte[] fieldToBytes(Object field) { + return JSON.toJSONBytes(field); + } + + @Override + public Object fieldFromBytes(byte[] bytes) { + if( bytes == null ){ + return null; + } + + try{ + return JSON.parse(bytes); + }catch (Exception e){ + log.error(e.getMessage(), e); + return null; + } + } + + @Override + public byte[] valueToBytes(Object value) { + SerializeConfig mapping = new SerializeConfig(); +// mapping.put(org.bson.types.ObjectId.class, new ObjectIdSerializer()); // mongodb ObjectId + + return JSON.toJSONBytes(value, mapping); + } + + @Override + public Object valueFromBytes(byte[] bytes) { + if( bytes == null ){ + return null; + } + + try{ + + return JSON.parse(bytes); + }catch (Exception e){ + log.error(e.getMessage(), e); + return null; + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/AESUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/AESUtil.java new file mode 100644 index 0000000..beb4071 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/AESUtil.java @@ -0,0 +1,94 @@ +package com.cowr.common.utils; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; +import java.util.Arrays; + +public class AESUtil { + public static byte[] encrypt(String key, byte[] origData) throws GeneralSecurityException { + byte[] keyBytes = getKeyBytes(key); + byte[] buf = new byte[16]; + System.arraycopy(keyBytes, 0, buf, 0, keyBytes.length > buf.length ? keyBytes.length : buf.length); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(buf, "AES"), new IvParameterSpec(keyBytes)); + return cipher.doFinal(origData); + + } + + public static byte[] decrypt(String key, byte[] crypted) throws GeneralSecurityException { + byte[] keyBytes = getKeyBytes(key); + byte[] buf = new byte[16]; + System.arraycopy(keyBytes, 0, buf, 0, keyBytes.length > buf.length ? keyBytes.length : buf.length); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(buf, "AES"), new IvParameterSpec(keyBytes)); + return cipher.doFinal(crypted); + } + + private static byte[] getKeyBytes(String key) { + byte[] bytes = key.getBytes(); + return bytes.length == 16 ? bytes : Arrays.copyOf(bytes, 16); + } + + public static String encrypt(String key, String val) throws GeneralSecurityException { + byte[] origData = val.getBytes(); + byte[] crypted = encrypt(key, origData); + return parseByte2HexStr(crypted); + } + + public static String decrypt(String key, String val) throws GeneralSecurityException, UnsupportedEncodingException { + byte[] crypted = parseHexStr2Byte(val); + byte[] origData = decrypt(key, crypted); + return new String(origData, "utf-8"); + } + + + /** + * 将二进制转换成16进制 + * + * @param buf + * @return + */ + public static String parseByte2HexStr(byte buf[]) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < buf.length; i++) { + String hex = Integer.toHexString(buf[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sb.append(hex.toUpperCase()); + } + return sb.toString(); + } + + /** + * 将16进制转换为二进制 + * + * @param hexStr + * @return + */ + public static byte[] parseHexStr2Byte(String hexStr) { + if (hexStr.length() < 1) + return null; + byte[] result = new byte[hexStr.length() / 2]; + for (int i = 0; i < hexStr.length() / 2; i++) { + int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16); + int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16); + result[i] = (byte) (high * 16 + low); + } + return result; + } + + public static void main(String[] args) throws Exception { + String content = "加密之前加密之前加密之前"; + String password = "21"; + System.out.println("加密之前:" + content); + + String hexStrResult = encrypt(password, content); + System.out.println("加密之后:" + hexStrResult); + System.out.println("解密后的内容:" + decrypt(password, hexStrResult)); + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ChineseNumberUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ChineseNumberUtil.java new file mode 100644 index 0000000..8b3bf23 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ChineseNumberUtil.java @@ -0,0 +1,198 @@ +package com.cowr.common.utils; + +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; + +public class ChineseNumberUtil { + private static final String[] BEFORE_SCALE = {"万", "仟", "佰", "拾", "亿", "仟", "佰", "拾", "万", "仟", "佰", "拾", ""}; + + private static final String[] AFTER_SCALE = {"角", "分"}; + + private static final String DEFAULT_PATH_SEPARATOR = "."; + + private static final Map NUMBER_MAPPING = new HashMap(); + + static { + NUMBER_MAPPING.put("0", "零"); + NUMBER_MAPPING.put("1", "壹"); + NUMBER_MAPPING.put("2", "贰"); + NUMBER_MAPPING.put("3", "叁"); + NUMBER_MAPPING.put("4", "肆"); + NUMBER_MAPPING.put("5", "伍"); + NUMBER_MAPPING.put("6", "陆"); + NUMBER_MAPPING.put("7", "柒"); + NUMBER_MAPPING.put("8", "捌"); + NUMBER_MAPPING.put("9", "玖"); + } + + public static String getChineseNumber(String number) { + return getChineseNumber(number, null, null); + } + + + public static String getChineseNumber(String number, String unit, String postfix) { + String[] numbers = StrUtil.strToStrArray(number, DEFAULT_PATH_SEPARATOR); + if (numbers.length > 2) { + new NumberFormatException("数字格式错误!"); + } + int length = numbers[0].length(); + int isZero = 0; + StringBuffer result = new StringBuffer(); + + for (int i = 0; i < length; i++) { + String digit = String.valueOf(numbers[0].charAt(i)); + + // 第一个就是 0 + if(i == 0 && "0".equals(digit)){ + result.append(NUMBER_MAPPING.get("0")); + } + + boolean allZero = true; // 如果后继的全部是零,则跳出 + for (int j = i; j < length; j++) { + if (numbers[0].charAt(j) != '0') { + allZero = false; + break; + } + } + + if (allZero) { + boolean hasValue = false; + for (int z = i; z >= 0; z--) { + if (numbers[0].charAt(z) != '0' && length - z <= 7 && length - z >= 5) { + hasValue = true; + break; + } + } + // 加万单位 + if ((length - i > 4 && length <= 8) || (hasValue && length - i > 4)) { + result.append(BEFORE_SCALE[8]); + } + // 加亿单位 + if (length - i >= 9) { + result.append(BEFORE_SCALE[4]); + } + break; + } + + if (length < 9 && length - i == 5) { + if (!"0".equals(digit) && isZero > 0) { + result.append(NUMBER_MAPPING.get("0")); + } + if ("0".equals(digit)) { + result.append(BEFORE_SCALE[8]); + if (isZero > 0) { + result.append(NUMBER_MAPPING.get("0")); + } + continue; + } + } + if ("0".equals(digit) && length > 9 && length - i == 9) { + result.append(BEFORE_SCALE[4]); + continue; + } + + if (isZero < 1 || !"0".equals(digit)) { + if ("0".equals(digit)) { + if (length - i != 6 && length - i != 7) { + result.append(NUMBER_MAPPING.get(digit)); + } + } else { + result.append(NUMBER_MAPPING.get(digit)); + } + + if (!"0".equals(digit)) { + result.append(BEFORE_SCALE[BEFORE_SCALE.length - length + i]); + } + } + + if ("0".equals(digit)) { + isZero++; + } else { + isZero = 0; + } + } + result.append(unit == null ? "圆" : result.append(unit)); + + if (numbers.length == 1) { + result.append(postfix == null ? "整" : result.append(postfix)); + return result.toString(); + } + + length = numbers[1].length(); + for (int j = 0; j < length; j++) { + if (j > 2) { + break; + } + if (numbers[1].charAt(j) == '0') { + continue; + } + result.append(NUMBER_MAPPING.get(String.valueOf(numbers[1].charAt(j)))); + result.append(AFTER_SCALE[j]); + } + + result.append(postfix == null ? "整" : result.append(postfix)); + + return result.toString(); + } + + public static String getChineseNumber(int number) { + return getChineseNumber(new Integer(number)); + } + + public static String getChineseNumber(int number, String unit, String postfix) { + return getChineseNumber(new Integer(number), unit, postfix); + } + + public static String getChineseNumber(Long number) { + return getChineseNumber(number.toString(), null, null); + } + + public static String getChineseNumber(Integer number) { + return getChineseNumber(number.toString(), null, null); + } + + public static String getChineseNumber(Integer number, String unit, String postfix) { + return getChineseNumber(number.toString(), unit, postfix); + } + + public static String getChineseNumber(Long number, String unit, String postfix) { + return getChineseNumber(number.toString(), unit, postfix); + } + + public static String getChineseNumber(long number) { + return getChineseNumber(new Long(number)); + } + + public static String getChineseNumber(long number, String unit, String postfix) { + return getChineseNumber(new Long(number), unit, postfix); + } + + public static String getChineseNumber(double number, String unit, String postfix) { + DecimalFormat f = (DecimalFormat) DecimalFormat.getInstance(); + f.applyLocalizedPattern("#.##"); + return getChineseNumber(f.format(number), unit, postfix); + } + + public static String getChineseNumber(double number) { + return getChineseNumber(number, null, null); + } + + public static String getChineseNumber(Double number) { + return getChineseNumber(number.doubleValue()); + } + + public static String getChineseNumber(Double number, String unit, String postfix) { + return getChineseNumber(number.doubleValue(), unit, postfix); + } + + public static void main(String[] args) { +// System.out.println(getChineseNumber(0)); +// System.out.println(getChineseNumber(10)); +// System.out.println(getChineseNumber(01)); + System.out.println(getChineseNumber(0101)); +// System.out.println(getChineseNumber(1994)); +// System.out.println(getChineseNumber(1994.1115)); +// System.out.println(getChineseNumber(19941115)); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DataUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DataUtil.java new file mode 100644 index 0000000..13d4b3d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DataUtil.java @@ -0,0 +1,140 @@ +package com.cowr.common.utils; + +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DataUtil { + /** + * 将列表结构树数据,转换成树状结构 + * 固定配置属性 + * @param sNodes + * @return + */ + public static List transformToTreeFormat(List sNodes){ + Map setting = new HashMap(); + + setting.put("idKey", "id"); + setting.put("pIdKey", "pid"); + setting.put("childKey", "children"); + + return transformToTreeFormat(setting, sNodes); + } + + /** + * + * { + * idKey : 'id', + * pIdKey : 'pid', + * childKey : 'children' + * } + * + * @param setting + * @param sNodes + */ + public static List transformToTreeFormat(Map setting, List sNodes){ + List r = new ArrayList(); + String key = setting.get("idKey"); + String parentKey = setting.get("pIdKey"); + String childKey = setting.get("childKey"); + + if ( !StrKit.notBlank(key, parentKey, childKey) ){ + return r; + } + + Map tmpMap = new HashMap(); + + for( Record node : sNodes ){ + tmpMap.put(node.get(key), node); + } + + for( Record node : sNodes ){ + Object id = node.get(key); + Object pid = node.get(parentKey); + + if( tmpMap.containsKey(pid) && !id.equals(pid) ){ + Record pnode = tmpMap.get(pid); + + if( pnode.get(childKey) == null ){ + pnode.set(childKey, new ArrayList()); + } + + ((ArrayList)pnode.get(childKey)).add(node); + }else{ + r.add(node); + } + } + + return r; + } + + public static Record cloneRecord(Record record) { + return cloneRecord(record, false); + } + + /** + * 克隆 record 对象 + * @param record + * @param deep 是否递归克隆 + * @return + */ + public static Record cloneRecord(Record record, boolean deep){ + String[] keys = record.getColumnNames(); + Record out = new Record(); + + for(String key : keys){ + Object object = record.get(key); + + if(deep && object instanceof Record){ + object = cloneRecord((Record) object); + } + + out.set(key, object); + } + + return out; + } + + /** + * 从 record 中取出 double 值,当对象为 BigDecimal 时,也只返回 double + * @param record + * @param key + * @return + */ + public static Double getDoubleByRecord(Record record, String key){ + if(record == null){ + return null; + } + + Object obj = record.get(key); + + if(obj == null){ + return null; + } + + if(obj instanceof Double){ + return record.getDouble(key); + } + + if(obj instanceof BigDecimal){ + return record.getBigDecimal(key).doubleValue(); + } + + if(obj instanceof String){ + return Double.valueOf(record.getStr(key)); + } + + return null; + } + + public static Double getDefaultByRecord(Record record, String key){ + Double obj = getDoubleByRecord(record, key); + + return obj == null ? 0.0 : obj; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DateTimeUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DateTimeUtil.java new file mode 100644 index 0000000..8bd0010 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/DateTimeUtil.java @@ -0,0 +1,67 @@ +package com.cowr.common.utils; + +import com.jfinal.kit.StrKit; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateTimeUtil { + public static final String ymdhms = "yyyy-MM-dd HH:mm:ss"; + + public static final ThreadLocal sdf = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd"); + } + }; + public static final ThreadLocal sdfymd = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy年MM月dd日"); + } + }; + public static final ThreadLocal sd = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM"); + } + }; + public static final ThreadLocal sdfym = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy年MM月"); + } + }; + public static final ThreadLocal sdfhms = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + public static final ThreadLocal sdfhm = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm"); + } + }; + /** + * 验证是否符合格式的时间字符串 + * @param str + * @param fmt + * @return + */ + public static boolean isValidDate(String str, String fmt) { + if (!StrKit.notBlank(str, fmt)) { + return false; + } + + SimpleDateFormat sdf = new SimpleDateFormat(fmt); + try { + // 设置lenient为false. + // 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01 + sdf.setLenient(false); + Date tm = sdf.parse(str); + + return sdf.format(tm).equals(str); // 将转换后的时间再格式化,和原字符串对比,检查是否一致 + } catch (ParseException e) { + // e.printStackTrace(); + // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 + return false; + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ImageUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ImageUtil.java new file mode 100644 index 0000000..4bfdf6f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ImageUtil.java @@ -0,0 +1,107 @@ +package com.cowr.common.utils; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.jfinal.kit.Base64Kit; +import com.jfinal.log.Log; +import net.coobird.thumbnailator.Thumbnails; +import sun.misc.BASE64Decoder; + +import java.io.*; +import java.util.Base64; + +public class ImageUtil { + private static Log log = Log.getLog(ImageUtil.class); + + public static File createThumbnail(File imageFile, String newname) throws IOException { + if (imageFile == null || imageFile.isDirectory() || !imageFile.exists()) { + return null; + } + + String oldpath = imageFile.getAbsolutePath(); + String outfmt = oldpath.substring(oldpath.lastIndexOf(".") + 1, oldpath.length()).toLowerCase(); + String newpath = imageFile.getParentFile().getAbsolutePath() + "/" + newname; + + Thumbnails.of(oldpath).scale(0.7f).outputFormat(outfmt).toFile(newpath); + + File newfile = new File(newpath); + + if (newfile != null && newfile.exists()) { + return newfile; + } + + return null; + } + + public static boolean generateImage(String imgStr, File imgFile) {// 对字节数组字符串进行Base64解码并生成图片 + if (imgStr == null) // 图像数据为空 + return false; + + BASE64Decoder decoder = new BASE64Decoder(); + OutputStream out = null; + try { + // Base64解码 + byte[] bytes = decoder.decodeBuffer(imgStr); + for (int i = 0; i < bytes.length; ++i) { + if (bytes[i] < 0) {// 调整异常数据 + bytes[i] += 256; + } + } + // 生成图片 + out = new FileOutputStream(imgFile); + out.write(bytes); + out.flush(); + out.close(); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } finally { + if (out != null) { + try { + out.flush(); + out.close(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } + } + + public static byte[] getQRCodeImage(String text, int width, int height, String format) throws WriterException, IOException { + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height); + + ByteArrayOutputStream out = null; + try{ + out = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, format, out); + return out.toByteArray(); + }catch (Exception e){ + throw e; + }finally { + if(out!= null){ + out.close(); + } + } + } + + public static String getQRCodeBase64(String text, int width, int height, String format) throws IOException, WriterException { + return Base64Kit.encode(getQRCodeImage(text, width, height, format)); + } + + + public static void main(String[] args) { + File file = new File("C:\\Users\\lisai\\Desktop\\402-1-鄂A7D1P11148.jpg"); + + try { + createThumbnail(file, "123"); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/JsonUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/JsonUtil.java new file mode 100644 index 0000000..6fc06a7 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/JsonUtil.java @@ -0,0 +1,39 @@ +package com.cowr.common.utils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +public class JsonUtil { + public static JSONObject key2Lower(JSONObject obj){ + return key2Lower(obj, false); + } + + /** + * json 对象 key 转小写 + * @param obj + * @param deep + * @return + */ + public static JSONObject key2Lower(JSONObject obj, boolean deep){ + if(obj == null || obj.isEmpty()){ + return obj; + } + + JSONObject out = new JSONObject(); + + for( String key : obj.keySet() ){ + Object tmp = obj.get(key); + if( tmp instanceof JSONObject && deep ){ + tmp = key2Lower((JSONObject)tmp, deep); + }else if( tmp instanceof JSONArray && deep ){ + JSONArray arr = (JSONArray) tmp; + for(int i=0; i= b){ + b++; + return b; + } + else + return b; + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ReqUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ReqUtil.java new file mode 100644 index 0000000..e210eea --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/ReqUtil.java @@ -0,0 +1,34 @@ +package com.cowr.common.utils; + +import javax.servlet.http.HttpServletRequest; + +public class ReqUtil { + /** + * 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址, + * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢? + * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 + * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100 + * 用户真实IP为: 192.168.1.110 + * @param request + * @return + */ + public static String getIpAddress(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/StrUtil.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/StrUtil.java new file mode 100644 index 0000000..04c8ebb --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/utils/StrUtil.java @@ -0,0 +1,206 @@ +package com.cowr.common.utils; + +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Record; + +import java.util.Collection; +import java.util.Iterator; +import java.util.StringTokenizer; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StrUtil { + public static final String regphone = "^1[3|4|5|7|8|9][\\d]{9}$"; // 放的比较宽 + public static final String DEFAULT_PATH_SEPARATOR = ","; + + /** + * 根据传入的 adcd 截取到对应的行政区划 + * 例如,传入村,保留前12位,传入镇,保留前9位,以此类推 + * + * @param adcd + * @return + */ + public static String getLikeAdcd(String adcd) { + if (StrKit.isBlank(adcd)) { + return ""; + } + + if ((adcd.length() == 15 && adcd.endsWith("000000000")) || (adcd.length() == 12 && adcd.endsWith("000000"))) { + return adcd.substring(0, 6) + "%"; + } + + if ((adcd.length() == 15 && adcd.endsWith("000000")) || (adcd.length() == 12 && adcd.endsWith("000"))) { + return adcd.substring(0, 9) + "%"; + } + + if (adcd.length() == 15 && adcd.endsWith("000")) { + return adcd.substring(0, 12) + "%"; + } + + return adcd + "%"; + } + + /** + * 判断是否是县级行政区划编码 + * + * @param adcd + * @return + */ + public static boolean isCounty(String adcd) { + if (StrKit.isBlank(adcd)) { + return false; + } + + return (adcd.length() == 15 && adcd.endsWith("000000000")) || (adcd.length() == 12 && adcd.endsWith("000000")); + } + + /** + * 判断是否是乡镇级行政区划编码 + * + * @param adcd + * @return + */ + public static boolean isTown(String adcd) { + if (StrKit.isBlank(adcd)) { + return false; + } + + return ( + adcd.length() == 15 && !adcd.endsWith("000000000") && adcd.endsWith("000000")) + || (adcd.length() == 12 && !adcd.endsWith("000000") && adcd.endsWith("000") + ); + } + + /** + * 判断是否是行政村级行政区划编码 + * + * @param adcd + * @return + */ + public static boolean isVillage(String adcd) { + if (StrKit.isBlank(adcd)) { + return false; + } + + return ( + adcd.length() == 15 && !adcd.endsWith("000000000") && !adcd.endsWith("000000") && adcd.endsWith("000")) + || (adcd.length() == 12 && !adcd.endsWith("000000") && !adcd.endsWith("000") + ); + } + + /** + * 判断是否是自然村村级行政区划编码 + * + * @param adcd + * @return + */ + public static boolean isNaturalVillage(String adcd) { + if (StrKit.isBlank(adcd) || adcd.length() != 15) { + return false; + } + + return !adcd.endsWith("000"); + } + + public static boolean isPhone(String phone) { + return Pattern.matches(regphone, phone); + } + + /** + * 构造sql + * @param table + * @param columns + * @return + */ + public static String findByColumnsSql(String table, String... columns) { + StringBuilder sql = new StringBuilder("select * from `"); + sql.append(table); + sql.append("` where "); + for (int i=0; i 0) { + sql.append(" and "); + } + sql.append('`').append(columns[i]).append("` = ?"); + } + return sql.toString(); + } + + /** + * 限定返回结果,只要第一个 + * @param table + * @param columns + * @return + */ + public static String findFirstByColumnsSql(String table, String... columns) { + return findByColumnsSql(table, columns) + " limit 0,1"; + } + + /** + * 将一个中间带逗号分隔符的字符串转换为字符型数组对象 + * + * @param str + * 待转换的符串对象 + * @return 字符型数组 + */ + public static String[] strToStrArray(String str) { + return strToStrArrayManager(str, DEFAULT_PATH_SEPARATOR); + } + + /** + * 将字符串对象按给定的分隔符separator转象为字符型数组对象 + * + * @param str 待转换的符串对象 + * @param separator 字符型分隔符 + * @return 字符型数组 + */ + public static String[] strToStrArray(String str, String separator) { + return strToStrArrayManager(str, separator); + } + + private static String[] strToStrArrayManager(String str, String separator) { + + StringTokenizer strTokens = new StringTokenizer(str, separator); + String[] strArray = new String[strTokens.countTokens()]; + int i = 0; + + while (strTokens.hasMoreTokens()) { + strArray[i] = strTokens.nextToken().trim(); + i++; + } + + return strArray; + } + + public static String getRecordStr(Record record, String key){ + String out = record.getStr(key); + + if(out == null){ + return ""; + } + + return out; + } + + public static boolean validPhone(String phone){ + if(StrKit.isBlank(phone)){ + return false; + } + + Pattern pattern = Pattern.compile(StrUtil.regphone); + Matcher matcher = pattern.matcher(phone); + return matcher.matches(); + } + + public static String join(Collection var0, String var1) { + StringBuffer var2 = new StringBuffer(); + + for(Iterator var3 = var0.iterator(); var3.hasNext(); var2.append((String)var3.next())) { + if (var2.length() != 0) { + var2.append(var1); + } + } + + return var2.toString(); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CrudParamValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CrudParamValidator.java new file mode 100644 index 0000000..3484ebf --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CrudParamValidator.java @@ -0,0 +1,46 @@ +package com.cowr.common.validator; + +import com.jfinal.plugin.activerecord.Model; +import com.jfinal.plugin.activerecord.Table; +import com.jfinal.plugin.activerecord.TableMapping; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +/** + * 增删该查相关验证 + */ +public abstract class CrudParamValidator extends ParamValidator { + + protected void validateUpdateModel(Class modelClass, String modelName) { + validateUpdateModel(modelClass, modelName, true); + } + /** + * 通过 model.update() 跟新数据时,检查是否只有主键相关的字段 + * 避免 com.jfinal.oss.activerecord.Model.update(Model.java:630) 这抛异常 + * @param modelClass 根据model class 找到映射的表,查找映射的表的字段、主键 + * @param modelName + */ + protected void validateUpdateModel(Class modelClass, String modelName, boolean skipConvertError) { + Model model = (Model)controller.getModel(modelClass, modelName, skipConvertError); + + boolean pass = false; + Table table = TableMapping.me().getTable(modelClass); + + String[] pKeys = table.getPrimaryKey(); + List pks = Arrays.asList(pKeys); + Set cols = table.getColumnNameSet(); + + for (String col : cols) { + if (!pks.contains(col) && model.get(col) != null) { + pass = true; + } + } + + if (!pass) { + addError("pk", "除主键外的字段不能全是空"); + } + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CustomerIdValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CustomerIdValidator.java new file mode 100644 index 0000000..30de8dd --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/CustomerIdValidator.java @@ -0,0 +1,22 @@ +package com.cowr.common.validator; + +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Thu Jun 27 14:48:36 CST 2019 + * TableName: customer + * Remarks: 客户 + * PrimaryKey: id + */ +public class CustomerIdValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("customer_id", "customer_id", "customer_id 必填"); + validateInteger("customer_id", 1, 2147483647, "customer_id", "customer_id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/DayValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/DayValidator.java new file mode 100644 index 0000000..f018152 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/DayValidator.java @@ -0,0 +1,18 @@ +package com.cowr.common.validator; + +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Thu Jun 27 17:01:16 CST 2019 + */ +public class DayValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateDate("tm", "yyyy-MM-dd","tm","tm 格式必须为 yyyy-MM-dd"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/MonthValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/MonthValidator.java new file mode 100644 index 0000000..a2c1a78 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/MonthValidator.java @@ -0,0 +1,18 @@ +package com.cowr.common.validator; + +import com.jfinal.core.Controller; +import com.cowr.common.view.Result; + +/** + * Generated by COWR Thu Jun 27 17:01:16 CST 2019 + */ +public class MonthValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateDate("tm", "yyyy-MM","tm","tm 格式必须为 yyyy-MM"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/ParamValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/ParamValidator.java new file mode 100644 index 0000000..9fc7ee2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/ParamValidator.java @@ -0,0 +1,149 @@ +package com.cowr.common.validator; + +import com.cowr.common.utils.DateTimeUtil; +import com.jfinal.kit.StrKit; +import com.jfinal.validate.ValidateException; +import com.jfinal.validate.Validator; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * TODO: 不是必填项的格式验证规则? + */ +public abstract class ParamValidator extends Validator { + /** + * 记录错误信息 + * 在 handleError 里面将 errmsg tojson 输出到前端 + */ + private Map errmsg = new HashMap<>(); + + /** + * 添加错误到 map + * @param errorKey + * @param errorMessage + */ + protected void addError(String errorKey, String errorMessage) { + invalid = true; + errmsg.put(errorKey, errorMessage); + if (shortCircuit) { + throw new ValidateException(); + } + } + + protected Map getErrmsg() { + return this.errmsg; + } + + /** + * @param field 字段名称 + * @param datePattern 时间格式 + * @param errorKey 存储错误的key + * @param errorMessage 错误描述信息 + */ + protected void validateDate(String field, String datePattern, String errorKey, String errorMessage) { + validateDate(field, datePattern, true, errorKey, errorMessage); + } + + /** + * 指定格式验证时间字段 + * @param field 字段名称 + * @param datePattern 时间格式 + * @param isRequired 是否必填,如果非必填,只有在获取到值时才校验是否符合格式 + * @param errorKey 存储错误的key + * @param errorMessage 错误描述信息 + */ + protected void validateDate(String field, String datePattern, boolean isRequired, String errorKey, String errorMessage) { + String value = controller.getPara(field); + if (StrKit.isBlank(value)) { + addError(errorKey, errorMessage); + return ; + } + + if( !DateTimeUtil.isValidDate(value, datePattern) ){ + addError(errorKey, errorMessage); + } + } + + + /** + * Validate double. + */ + protected void validateBigDecimal(String field, BigDecimal min, BigDecimal max, String errorKey, String errorMessage) { + String value = controller.getPara(field); + if (StrKit.isBlank(value)) { + addError(errorKey, errorMessage); + return ; + } + try { + BigDecimal temp = new BigDecimal(value.trim()); + if (temp.compareTo(min) < 0 || temp.compareTo(max) > 0 ) { + addError(errorKey, errorMessage); + } + } + catch (Exception e) { + addError(errorKey, errorMessage); + } + } + + /** + * Validate double. + */ + protected void validateBigDecimal(String field, String errorKey, String errorMessage) { + String value = controller.getPara(field); + if (StrKit.isBlank(value)) { + addError(errorKey, errorMessage); + return ; + } + try { + new BigDecimal(value.trim()); + } + catch (Exception e) { + addError(errorKey, errorMessage); + } + } + + protected void validateInIntegerArray(String field, List chklist, String errorKey, String errorMessage){ + String value = controller.getPara(field); + if (StrKit.isBlank(value)) { + addError(errorKey, errorMessage); + } + try { + Integer temp = Integer.parseInt(value.trim()); + + for(Integer integer : chklist){ + if(integer.equals(temp)){ + return; + } + } + + // 没有找到 + addError(errorKey, errorMessage); + } catch (Exception e) { + addError(errorKey, errorMessage); + } + } + + protected void validateInStringArray(String field, List chklist, String errorKey, String errorMessage){ + String value = controller.getPara(field); + if (StrKit.isBlank(value)) { + addError(errorKey, errorMessage); + } + try { + String temp = value.trim(); + + for(String str : chklist){ + if(str.equals(temp)){ + return; + } + } + + // 没有找到 + addError(errorKey, errorMessage); + } catch (Exception e) { + addError(errorKey, errorMessage); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/PhoneValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/PhoneValidator.java new file mode 100644 index 0000000..f43960f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/PhoneValidator.java @@ -0,0 +1,27 @@ +package com.cowr.common.validator; + +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Tue Jun 25 00:41:56 CST 2019 + * TableName: sysuser + * Remarks: + * PrimaryKey: id + */ +public class PhoneValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + /** + * 座机正则 /^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/ + * 手机号正则,不是很严格 /^1[3|4|5|7|8|9][\d]{9}$/ + */ + + validateString("phone", 0, 11, "phone", "phone 长度1~11"); // 必填项,字段长度必须大于0,不能超过最大长度 + + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndTimeValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndTimeValidator.java new file mode 100644 index 0000000..98d5935 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndTimeValidator.java @@ -0,0 +1,19 @@ +package com.cowr.common.validator; + +import com.jfinal.core.Controller; +import com.cowr.common.view.Result; + +public class StartAndEndTimeValidator extends ParamValidator { + @Override + protected void validate(Controller c) { +// setShortCircuit(true); + validateRequired("stm", "stm","stm 必填"); + validateRequired("etm", "etm","etm 必填"); + validateDate("stm", "yyyy-MM-dd HH:mm:ss","stm","stm 格式错误"); + validateDate("etm", "yyyy-MM-dd HH:mm:ss","etm","etm 格式错误"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndintervalValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndintervalValidator.java new file mode 100644 index 0000000..065685a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/StartAndEndintervalValidator.java @@ -0,0 +1,42 @@ +package com.cowr.common.validator; + +import com.cowr.common.utils.DateTimeUtil; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class StartAndEndintervalValidator extends ParamValidator { + private static DateFormat ymdhms = new SimpleDateFormat(DateTimeUtil.ymdhms); + + @Override + protected void validate(Controller c) { + setShortCircuit(true); + validateRequired("stm", "stm", "stm 必填"); + validateRequired("etm", "etm", "etm 必填"); + validateDate("stm", "yyyy-MM-dd HH:mm:ss", "stm", "stm 格式错误"); + validateDate("etm", "yyyy-MM-dd HH:mm:ss", "etm", "etm 格式错误"); + + String stm = c.getPara("stm"); + String etm = c.getPara("etm"); + try { + Date st = ymdhms.parse(stm); + Date et = ymdhms.parse(etm); + + // 1000 * 60 * 60 * 24 * 31 * 3 3个月 + if (et.getTime() - st.getTime() > 1000L * 60 * 60 * 24 * 31 * 12) { + addError("stm_etm", "时间间隔不超过12个月"); + } + } catch (ParseException e) { + addError("stm_etm", e.getMessage()); + } + + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/YearValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/YearValidator.java new file mode 100644 index 0000000..fab648a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/validator/YearValidator.java @@ -0,0 +1,18 @@ +package com.cowr.common.validator; + +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Thu Jun 27 17:01:16 CST 2019 + */ +public class YearValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateDate("tm", "yyyy","tm","tm 格式必须为 yyyy"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ActionReporter.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ActionReporter.java new file mode 100644 index 0000000..5cb5b70 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ActionReporter.java @@ -0,0 +1,248 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cowr.common.view; + +import com.jfinal.aop.Interceptor; +import com.jfinal.core.Action; +import com.jfinal.core.Const; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.cowr.common.utils.ReqUtil; +import eu.bitwalker.useragentutils.UserAgent; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Enumeration; +import java.util.List; + +/** + * ActionReporter + */ +public class ActionReporter { + private static Log log = Log.getLog(ActionReporter.class); + private static final String title = "\nJFinal-" + Const.JFINAL_VERSION + " action report -------- "; + private static boolean reportAfterInvocation = true; + private static int maxOutputLengthOfParaValue = 512; + private static Writer writer = new SystemOutWriter(); + + private static final ThreadLocal sdf = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + + public static void setReportAfterInvocation(boolean reportAfterInvocation) { + ActionReporter.reportAfterInvocation = reportAfterInvocation; + } + + public static void setMaxOutputLengthOfParaValue(int maxOutputLengthOfParaValue) { + if (maxOutputLengthOfParaValue < 16) { + throw new IllegalArgumentException("maxOutputLengthOfParaValue must more than 16"); + } + ActionReporter.maxOutputLengthOfParaValue = maxOutputLengthOfParaValue; + } + + public static void setWriter(Writer writer) { + if (writer == null) { + throw new IllegalArgumentException("writer can not be null"); + } + ActionReporter.writer = writer; + } + + public static boolean isReportAfterInvocation(HttpServletRequest request) { + if (reportAfterInvocation) { + return true; + } else { + String contentType = request.getContentType(); + if (contentType != null && contentType.toLowerCase().indexOf("multipart") != -1) { + return true; + } else { + return false; + } + } + } + + + private static int lineNum(String codeFragment, String fileName){ + List lines = null; + int lineNum = 1; + Path path = Paths.get(fileName); + try{ + lines = Files.readAllLines(path, Charset.forName("utf-8")); + + for(int i = 0; i < lines.size(); i++){ + String line = lines.get(i); + lineNum = i + 1; + if(deleteWhitespace(line).toLowerCase().startsWith(codeFragment.toLowerCase())){ + break; + } + } + } + catch(Exception e2){ + return 1; + } + return lineNum; + } + + private static String deleteWhitespace(String str){ + if(StrKit.isBlank(str)){ + return str; + } + int sz = str.length(); + char[] chs = new char[sz]; + int count = 0; + for(int i = 0; i < sz; i++){ + if(!Character.isWhitespace(str.charAt(i))){ + chs[count++] = str.charAt(i); + } + } + if(count == sz){ + return str; + } + return new String(chs, 0, count); + } + + /** + * 根据 class 获取 .java 文件的绝对路径 + * 需要根据项目实际的路径调整 + * 目前只适合 windows 下的调试使用 + * TODO 参考 log4j 优化 + * @param clazz + * @return + */ + private static String fileName(@SuppressWarnings("rawtypes") Class clazz){ + StringBuilder cf = new StringBuilder(System.getProperty("user.dir")).append(File.separator).append("src") + .append(File.separator).append("main").append(File.separator).append("java"); + + StringBuilder classFile = new StringBuilder() + .append(File.separator).append("src") + .append(File.separator).append("main") + .append(File.separator).append("java"); + for(String temp : clazz.getName().split("\\.")){ + classFile.append(File.separator).append(temp); + } + + String classpath = clazz.getResource("").getPath(); + if(!classpath.contains("/target/classes/")){ + return classFile.append(".java").toString(); + } + + String classsrc = classpath.substring(1, classpath.indexOf("/target/classes/")); + + return classsrc + classFile.append(".java").toString(); + } + + /** + * Report the action + */ + public static final void report(String target, Controller controller, Action action) { + StringBuilder sb = new StringBuilder(title).append(sdf.get().format(new Date())).append(" --------------------------\n"); + sb.append("Url : ").append(controller.getRequest().getMethod()).append(" ").append(target).append("\n"); + Class cc = action.getControllerClass(); + if(System.getProperty("file.separator").equals("\\")){ + sb.append("Controller : ").append(cc.getName()).append(".(").append(cc.getSimpleName()).append(".java:") + .append(lineNum("publicvoid" + action.getMethodName() + "(){", fileName(cc))).append(")"); + }else{ + sb.append("Controller : ").append(cc.getName()).append(".(").append(cc.getSimpleName()).append(".java:1)"); + } + sb.append("\nMethod : ").append(action.getMethodName()).append("\n"); + + String urlParas = controller.getPara(); + if (urlParas != null) { + sb.append("UrlPara : ").append(urlParas).append("\n"); + } + + Interceptor[] inters = action.getInterceptors(); + if (inters.length > 0) { + sb.append("Interceptor : "); + for (int i=0; i 0) + sb.append("\n "); + Interceptor inter = inters[i]; + Class ic = inter.getClass(); + sb.append(ic.getName()).append(".(").append(ic.getSimpleName()).append(".java:1)"); + } + sb.append("\n"); + } + + // print all parameters + HttpServletRequest request = controller.getRequest(); + Enumeration e = request.getParameterNames(); + if (e.hasMoreElements()) { + sb.append("Parameter : "); + while (e.hasMoreElements()) { + String name = e.nextElement(); + String[] values = request.getParameterValues(name); + if (values.length == 1) { + sb.append(name).append("="); + if (values[0] != null && values[0].length() > maxOutputLengthOfParaValue) { + sb.append(values[0].substring(0, maxOutputLengthOfParaValue)).append("..."); + } else { + sb.append(values[0]); + } + } + else { + sb.append(name).append("[]={"); + for (int i=0; i 0) + sb.append(","); + sb.append(values[i]); + } + sb.append("}"); + } + sb.append(" "); + } + sb.append("\n"); + } + + String ip = ReqUtil.getIpAddress(request); + //转成UserAgent对象 + UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); + + sb.append("IP : ").append(ip).append("\n"); + sb.append("OS : ").append(userAgent.getOperatingSystem().getName()).append("\n"); + sb.append("Browser : ").append(userAgent.getBrowser().getName()).append(" ").append(userAgent.getBrowserVersion()).append("\n"); + sb.append("--------------------------------------------------------------------------------\n"); + + try { + writer.write(sb.toString()); + writer.flush(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private static class SystemOutWriter extends Writer { + public void write(String str) throws IOException { + log.debug(str); + } + public void write(char[] cbuf, int off, int len) throws IOException {} + public void flush() throws IOException {} + public void close() throws IOException {} + } +} + + diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ExcelRender.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ExcelRender.java new file mode 100644 index 0000000..1bb71e0 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ExcelRender.java @@ -0,0 +1,74 @@ +package com.cowr.common.view; + +import com.jfinal.log.Log; +import com.jfinal.render.Render; +import com.jfinal.render.RenderException; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +public class ExcelRender extends Render { + private static Log log = Log.getLog(ExcelRender.class); + + private final static String CONTENT_TYPE = "application/msexcel;charset=" + + getEncoding(); + + private String fileName = ""; + private Workbook book; + + public ExcelRender(String filename, Workbook book) { + this.fileName = filename; + this.book = book; + } + + private String encodeFileName(String fileName) { + try { + return URLEncoder.encode(fileName, "UTF-8"); + } catch (UnsupportedEncodingException e) { + log.error(e.getMessage(), e); + return fileName; + } + + /*try { + return new String(fileName.getBytes("UTF-8"), "ISO8859-1"); + } catch (UnsupportedEncodingException e) { + return fileName; + }*/ + } + + @Override + public void render() { + this.response.reset(); + this.response.setHeader("Content-disposition", "attachment; filename=" + encodeFileName(fileName)); + this.response.setContentType(CONTENT_TYPE); + OutputStream os = null; + try { + os = response.getOutputStream(); + book.write(os); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new RenderException(e); + } finally { + try { + if (os != null) { + os.flush(); + os.close(); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + } + + if( book != null ){ + try { + book.close(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/JsonRenderFactory.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/JsonRenderFactory.java new file mode 100644 index 0000000..01220e8 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/JsonRenderFactory.java @@ -0,0 +1,19 @@ +package com.cowr.common.view; + +import com.jfinal.render.ErrorRender; +import com.jfinal.render.JsonRender; +import com.jfinal.render.Render; +import com.jfinal.render.RenderFactory; + +public class JsonRenderFactory extends RenderFactory { + public Render getErrorRender(int errorCode) { + return getErrorRender(errorCode, null); + } + public Render getErrorRender(int errorCode, String view) { + if(errorCode != 400){ + return new JsonRender(new Result(errorCode, null, view)); + }else{ + return new ErrorRender(400, view); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/PageParam.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/PageParam.java new file mode 100644 index 0000000..cf3edef --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/PageParam.java @@ -0,0 +1,61 @@ +package com.cowr.common.view; + +/** + * 分页参数 + */ +public class PageParam { + private String sort_field; + private String sort_order; + + private int page = 1; // 当前页码 + private int size = 20; // 每页行数 + + public String getSort_field() { + return sort_field; + } + + public void setSort_field(String sort_field) { + this.sort_field = sort_field; + } + + public String getSort_order() { + return sort_order; + } + + public void setSort_order(String sort_order) { + this.sort_order = sort_order; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public PageParam() { + + } + + public PageParam(String sort_field, String sort_order, int page, int size) { + this.sort_field = sort_field; + this.sort_order = sort_order; + this.page = page; + this.size = size; + } + + public PageParam(int page, int size) { + + this.page = page; + this.size = size; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ReportExcelStyle.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ReportExcelStyle.java new file mode 100644 index 0000000..817aaa5 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/ReportExcelStyle.java @@ -0,0 +1,131 @@ +package com.cowr.common.view; + +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; + +/** + * 设置导出通用样式 + */ +public class ReportExcelStyle { + public static void setCommonStyle( + Workbook wb, + Sheet sheet, + String title, + String subtitle, + int datalen, + int end_col + ){ + setCommonStyle(wb, sheet, title, subtitle, datalen, end_col, 4); + } + public static void setCommonStyle( + Workbook wb, + Sheet sheet, + String title, + String subtitle, + int datalen, + int end_col, + int sign_col + ){ + // 标题 start + Font font = wb.createFont(); + font.setBold(true); + font.setFontHeight((short) (18 * 20)); + font.setFontName("宋体"); + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); + cell.setCellValue(title); + row.setHeight((short) (40 * 20)); // POI中的行高单位是twips(缇) ,Office Excel行高单位是pt(磅) 设置的行高,单位为1/20pt + cell.setCellStyle(cellStyle); + // 标题 end + + // 副标题 start + font = wb.createFont(); + font.setFontHeight((short) (12 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(1); + row.setHeight((short) (28 * 20)); + cell = row.createCell(0); + cell.setCellValue(subtitle); + cell.setCellStyle(cellStyle); + // 副标题 end + + + // 通用单元格格式 + font = wb.createFont(); + cellStyle = wb.createCellStyle(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + cellStyle.setFont(font); + + // 设置通用单元格格式 + for (int r = 2; r < datalen + 4; r++) { + row = sheet.getRow(r); + if (row == null) { + row = sheet.createRow(r); + } + + for (int c = 0; c < end_col + 1; c++) { + cell = row.getCell(c); + + if (cell == null) { + cell = row.createCell(c); + } + cell.setCellStyle(cellStyle); + } + } + + font = wb.createFont(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(datalen + 4); + row.setHeight((short) (28 * 20)); + cell = row.createCell(1); + cell.setCellValue("统计人签名:"); + cell.setCellStyle(cellStyle); + cell = row.createCell(sign_col); + cell.setCellValue("复核人签名:"); + cellStyle.setAlignment(HorizontalAlignment.LEFT);//复核人签名 靠左 + cell.setCellStyle(cellStyle); + + sheet.setMargin(HSSFSheet.BottomMargin, (double) 0.5);// 页边距(下) + sheet.setMargin(HSSFSheet.LeftMargin, (double) 0.1);// 页边距(左) + sheet.setMargin(HSSFSheet.RightMargin, (double) 0.1);// 页边距(右) + sheet.setMargin(HSSFSheet.TopMargin, (double) 0.5);// 页边距(上) + + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + + // 每页打印标题 + sheet.setRepeatingRows(new CellRangeAddress(0, 2, -1, -1));//前两位数是设置需要重复打印的行的范围,后两位设置重复打印的列的范围。-1代表不重复打印。用于表头表头换页重复打印 + + wb.setPrintArea( + 0, //sheet index + 0, //start column + end_col, //end column + 0, //start row + sheet.getLastRowNum() //end row + ); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java new file mode 100644 index 0000000..c4e7f2a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/common/view/Result.java @@ -0,0 +1,224 @@ +package com.cowr.common.view; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.annotation.JSONField; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Record; + +import java.util.Map; + +public class Result { + private static Log log = Log.getLog(Result.class); + public static final int SUCCESS = 200; // 成功 + public static final int PARAM_ERROR = 400; // 失败、参数错误等 + public static final int UNAUTHORIZED = 401; // 用户验证失败,或者用户验证信息过期 + public static final int PERMISSION_DENIED = 403; // 没有权限 + public static final int NOT_FOUND = 404; // 未找到资源 + public static final int NOT_ALLOWED = 405; // 请求太频繁,同一个用户(token)、同一个url、同样的请求参数,请求间隔小于0.5秒 + public static final int SERVER_ERROR = 500; // 后台错误 + public static final int SRC_TIMEOUT = 504; // 请求资源超时 + + public static final String PERMISSION_DENIED_STR = "没有权限"; + public static final String NOT_FOUND_STR = "未找到资源"; + public static final String SERVER_ERROR_STR = "后台错误"; + public static final String SRC_TIMEOUT_STR = "请求第三方资源超时"; + + private int code; + private String msg; // 只用字符串,如果有其他类型,用 validerr 返回 + private Object data; + private Map validerr; // 表单验证失败返回消息 + + public Result() { + } + + public Result(Map validerr) { + this.code = PARAM_ERROR; + this.data = null; + this.msg = "表单验证失败"; + this.validerr = validerr; + + failedlog(this.msg, this.code); + } + + public Result(int code, Object data, String msg) { + this.code = code; + this.data = data; + + if (msg == null || "".equals(msg)) { + switch (code) { + case PERMISSION_DENIED: + this.msg = PERMISSION_DENIED_STR; + break; + case NOT_FOUND: + this.msg = NOT_FOUND_STR; + break; + case SERVER_ERROR: + this.msg = SERVER_ERROR_STR; + break; + case SRC_TIMEOUT: + this.msg = SRC_TIMEOUT_STR; + break; + } + } else { + this.msg = msg; + } + + if (code != SUCCESS) { + failedlog(this.msg, this.code); + } + } + + public Result(int code) { + this(code, null, null); + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Object getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + /** + * 强转 Record + * TODO 可能会有类型转换错误 + * @return Record + */ + @JSONField(serialize=false) + public Record getRecordData() { + return data != null ? (Record) data : null; + } + + public void setData(Object data) { + this.data = data; + } + + public Map getValiderr() { + return validerr; + } + + public void setValiderr(Map validerr) { + this.validerr = validerr; + } + + public String toJSONString() { + return JSONObject.toJSONString(this); + } + + public static Result success(Object data) { + return new Result(Result.SUCCESS, data, null); + } + + /** + * 没有请求到数据 data == null,就输出 msg ,请求到数据 data != null 则正常返回,没有msg + * 和 Result.object 对应 + * 该方法无论是否请求到数据,返回的 code 都为 200, Result.object 则是没有请求数据时返回 code 为 400 + * + * @param data + * @param msg + * @return + */ + public static Result success(Object data, String msg) { + return new Result(Result.SUCCESS, data, msg); + } + + public static Result success() { + return new Result(Result.SUCCESS); + } + + public static Result failed(String msg) { + return new Result(Result.PARAM_ERROR, null, msg); + } + + public static Result failedstr(String format, Object... objs) { + return new Result(Result.PARAM_ERROR, null, String.format(format, objs)); + } + + public static Result failed(Map validerr){ + return new Result(validerr); + } + + public static Result failed(Object ret, String msg) { + return new Result(Result.PARAM_ERROR, ret, msg); + } + + public static Result noauth() { + return new Result(Result.UNAUTHORIZED, null, "没有登录,或者登录超时"); + } + + public static Result notAllowed() { + return new Result(Result.NOT_ALLOWED, null, "请求太频繁"); + } + + public static Result error() { + return new Result(Result.SERVER_ERROR); + } + + public static Result permissionDenied() { + return permissionDenied("没有权限"); + } + + public static Result permissionDenied(String msg) { + return new Result(Result.PERMISSION_DENIED, null, msg); + } + + public static Result object(Object data) { + return Result.object(data, ""); + } + + /** + * 输出对象 + * + * @param data 数据体,若data != null 则正常输出 + * @param msg 若 data == null 则将 msg 输出 + * @return result 对象 + */ + public static Result object(Object data, String msg) { + if (data instanceof Result) { + return (Result) data; + } else if (data instanceof Boolean) { + int code = (Boolean) data ? Result.SUCCESS : Result.PARAM_ERROR; + return new Result(code, data, msg); + } else { + if (data != null) { + return new Result(Result.SUCCESS, data, null); + } + + return new Result(Result.PARAM_ERROR, null, msg); + } + } + + /** + * 输出不是 SUCCESS 时,打印 debug log + * + * @param msg + */ + private static void failedlog(String msg, int code) { + if (code == NOT_FOUND) { // 404 的就不输出了 + return; + } + log.debug(msg); + StackTraceElement[] mStacks = Thread.currentThread().getStackTrace(); + for (StackTraceElement s : mStacks) { + if (s.getClassName().contains("com.cowr") + && !s.getClassName().contains("com.cowr.common.view.Result") + && !s.getClassName().contains("com.cowr.common.handler.GlobalHandler") + && !s.getClassName().contains("com.cowr.common.Interceptor") + ) + log.debug("-> " + s); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/ActionCmdLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/ActionCmdLog.java new file mode 100644 index 0000000..6e05748 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/ActionCmdLog.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseActionCmdLog; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: action_cmd_log + * Remarks: 日志相关- 硬件操作指令日志 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class ActionCmdLog extends BaseActionCmdLog { + public static final ActionCmdLog dao = new ActionCmdLog().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/AuthLicense.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/AuthLicense.java new file mode 100644 index 0000000..b1adeb5 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/AuthLicense.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseAuthLicense; + +/** + * Generated by COWR Fri May 01 23:24:43 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +@SuppressWarnings("serial") +public class AuthLicense extends BaseAuthLicense { + public static final AuthLicense dao = new AuthLicense().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/AuthResult.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/AuthResult.java new file mode 100644 index 0000000..c279148 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/AuthResult.java @@ -0,0 +1,31 @@ +package com.cowr.model; + +public class AuthResult { + private String token; + private Sysuser sysuser; + + public AuthResult(String token, Sysuser sysuser) { + this.token = token; + this.sysuser = sysuser; + } + + public AuthResult() { + + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public Sysuser getSysuser() { + return sysuser; + } + + public void setSysuser(Sysuser sysuser) { + this.sysuser = sysuser; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Blacklist.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Blacklist.java new file mode 100644 index 0000000..68a9730 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Blacklist.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseBlacklist; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: blacklist + * Remarks: 基础配置 - 车辆黑名单 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Blacklist extends BaseBlacklist { + public static final Blacklist dao = new Blacklist().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Bocomm.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Bocomm.java new file mode 100644 index 0000000..f48967f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Bocomm.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseBocomm; + +/** + * Generated by COWR Fri May 29 10:27:06 CST 2020 + * TableName: bocomm + * Remarks: 支付相关 - 交行支付记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Bocomm extends BaseBocomm { + public static final Bocomm dao = new Bocomm().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/BocommRequest.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/BocommRequest.java new file mode 100644 index 0000000..a0ea672 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/BocommRequest.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseBocommRequest; + +/** + * Generated by COWR Fri May 29 11:23:08 CST 2020 + * TableName: bocomm_request + * Remarks: 支付相关 - 交行请求(提交到交行的)报文 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class BocommRequest extends BaseBocommRequest { + public static final BocommRequest dao = new BocommRequest().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/BocommResponse.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/BocommResponse.java new file mode 100644 index 0000000..f4a2484 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/BocommResponse.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseBocommResponse; + +/** + * Generated by COWR Fri May 29 11:23:08 CST 2020 + * TableName: bocomm_response + * Remarks: 支付相关 - 交行响应(推送过来的)报文 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class BocommResponse extends BaseBocommResponse { + public static final BocommResponse dao = new BocommResponse().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Cctv.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Cctv.java new file mode 100644 index 0000000..e09e654 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Cctv.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseCctv; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: cctv + * Remarks: 视频监控(硬盘录像机)信息 + * PrimaryKey: unit_id,unit_type + */ +@SuppressWarnings("serial") +public class Cctv extends BaseCctv { + public static final Cctv dao = new Cctv().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/CctvChannels.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/CctvChannels.java new file mode 100644 index 0000000..40c25fd --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/CctvChannels.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseCctvChannels; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: cctv_channels + * Remarks: 视频监控(硬盘录像机)通道信息 + * PrimaryKey: id,unit_id,unit_type + */ +@SuppressWarnings("serial") +public class CctvChannels extends BaseCctvChannels { + public static final CctvChannels dao = new CctvChannels().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Customer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Customer.java new file mode 100644 index 0000000..5736004 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Customer.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseCustomer; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: customer + * Remarks: 客户相关 - 客户 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Customer extends BaseCustomer { + public static final Customer dao = new Customer().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerContact.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerContact.java new file mode 100644 index 0000000..90e5e09 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerContact.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseCustomerContact; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: customer_contact + * Remarks: 客户相关 - 客户联系人 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class CustomerContact extends BaseCustomerContact { + public static final CustomerContact dao = new CustomerContact().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerReceiver.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerReceiver.java new file mode 100644 index 0000000..e70ffb4 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/CustomerReceiver.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseCustomerReceiver; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: customer_receiver + * Remarks: 客户相关 - 客户收获地址 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class CustomerReceiver extends BaseCustomerReceiver { + public static final CustomerReceiver dao = new CustomerReceiver().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/DeviceConfig.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/DeviceConfig.java new file mode 100644 index 0000000..fcbb05e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/DeviceConfig.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseDeviceConfig; + +/** + * Generated by COWR Mon May 04 01:37:44 CST 2020 + * TableName: device_config + * Remarks: 出入控制 - 设备连接参数配置 + * PrimaryKey: supermarket_id + */ +@SuppressWarnings("serial") +public class DeviceConfig extends BaseDeviceConfig { + public static final DeviceConfig dao = new DeviceConfig().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Driver.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Driver.java new file mode 100644 index 0000000..5754139 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Driver.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseDriver; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: driver + * Remarks: 基础配置 - 司机信息 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Driver extends BaseDriver { + public static final Driver dao = new Driver().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/ModifyLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/ModifyLog.java new file mode 100644 index 0000000..d18013a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/ModifyLog.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseModifyLog; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: modify_log + * Remarks: 日志相关 - 配置相关表修改日志记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class ModifyLog extends BaseModifyLog { + public static final ModifyLog dao = new ModifyLog().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderPurchase.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderPurchase.java new file mode 100644 index 0000000..966b2c1 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderPurchase.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseOrderPurchase; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: order_purchase + * Remarks: 订单相关 - 从采购点购买 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public class OrderPurchase extends BaseOrderPurchase { + public static final OrderPurchase dao = new OrderPurchase().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSale.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSale.java new file mode 100644 index 0000000..4aeced0 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSale.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseOrderSale; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: order_sale + * Remarks: 订单相关 - 销售单 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public class OrderSale extends BaseOrderSale { + public static final OrderSale dao = new OrderSale().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSeq.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSeq.java new file mode 100644 index 0000000..a42e993 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderSeq.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseOrderSeq; + +/** + * Generated by COWR Tue Apr 28 16:04:25 CST 2020 + * TableName: order_seq + * Remarks: 订单相关 - 序列号 + * PrimaryKey: tm,supermarket_id,type + */ +@SuppressWarnings("serial") +public class OrderSeq extends BaseOrderSeq { + public static final OrderSeq dao = new OrderSeq().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTemp.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTemp.java new file mode 100644 index 0000000..f80b5a9 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTemp.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseOrderTemp; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: order_temp + * Remarks: 订单相关 - 外销单 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public class OrderTemp extends BaseOrderTemp { + public static final OrderTemp dao = new OrderTemp().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTransfer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTransfer.java new file mode 100644 index 0000000..8e16639 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTransfer.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseOrderTransfer; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: order_transfer + * Remarks: 订单相关 - 转运单 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public class OrderTransfer extends BaseOrderTransfer { + public static final OrderTransfer dao = new OrderTransfer().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTrash.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTrash.java new file mode 100644 index 0000000..2ba99f1 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/OrderTrash.java @@ -0,0 +1,15 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseOrderTrash; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: order_trash + * Remarks: 订单相关 - 废料运出单 + + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public class OrderTrash extends BaseOrderTrash { + public static final OrderTrash dao = new OrderTrash().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Ordercluster.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Ordercluster.java new file mode 100644 index 0000000..b7b1285 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Ordercluster.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseOrdercluster; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: ordercluster + * Remarks: 订单相关 - 订单 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Ordercluster extends BaseOrdercluster { + public static final Ordercluster dao = new Ordercluster().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/PostLicenseResult.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/PostLicenseResult.java new file mode 100644 index 0000000..7afc3c8 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/PostLicenseResult.java @@ -0,0 +1,66 @@ +package com.cowr.model; + +public class PostLicenseResult { + private String license; + private boolean uploaded; + private String transport_id; + private String flow; + + public String getFlow() { + return flow; + } + + public void setFlow(String flow) { + this.flow = flow; + } + + private boolean access; + + public PostLicenseResult(String license) { + this.license = license; + this.uploaded = false; + this.transport_id = null; + this.access = false; + this.flow = null; + } + + public PostLicenseResult(String license, boolean uploaded, String transport_id, boolean access) { + this.license = license; + this.uploaded = uploaded; + this.transport_id = transport_id; + this.access = access; + this.flow = null; + } + + public String getLicense() { + return license; + } + + public void setLicense(String license) { + this.license = license; + } + + public boolean isUploaded() { + return uploaded; + } + + public void setUploaded(boolean uploaded) { + this.uploaded = uploaded; + } + + public String getTransportId() { + return transport_id; + } + + public void setTransportId(String transport_id) { + this.transport_id = transport_id; + } + + public boolean isAccess() { + return access; + } + + public void setAccess(boolean access) { + this.access = access; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayCustomer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayCustomer.java new file mode 100644 index 0000000..552edff --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayCustomer.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BasePrepayCustomer; + +/** + * Generated by COWR Sun May 17 21:43:18 CST 2020 + * TableName: prepay_customer + * Remarks: 客户相关 - 预付费客户余额信息,每个客户在每个超市有单独的余额 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class PrepayCustomer extends BasePrepayCustomer { + public static final PrepayCustomer dao = new PrepayCustomer().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetail.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetail.java new file mode 100644 index 0000000..4508d01 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetail.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BasePrepayDetail; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: prepay_detail + * Remarks: 客户相关 - 客户预付费 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class PrepayDetail extends BasePrepayDetail { + public static final PrepayDetail dao = new PrepayDetail().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetailStateHistory.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetailStateHistory.java new file mode 100644 index 0000000..d25191a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayDetailStateHistory.java @@ -0,0 +1,15 @@ +package com.cowr.model; + +import com.cowr.model.base.BasePrepayDetailStateHistory; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: prepay_detail_state_history + * Remarks: 客户相关 - 客户预付费记录状态变化日志 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class PrepayDetailStateHistory extends BasePrepayDetailStateHistory { + public static final PrepayDetailStateHistory dao = new PrepayDetailStateHistory().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayTruck.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayTruck.java new file mode 100644 index 0000000..76c072b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/PrepayTruck.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BasePrepayTruck; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: prepay_truck + * Remarks: 客户相关 - 预付费车辆 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class PrepayTruck extends BasePrepayTruck { + public static final PrepayTruck dao = new PrepayTruck().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Product.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Product.java new file mode 100644 index 0000000..f5a622f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Product.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseProduct; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: product + * Remarks: 基础配置 - 商品信息 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Product extends BaseProduct { + public static final Product dao = new Product().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Purchase.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Purchase.java new file mode 100644 index 0000000..03648bc --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Purchase.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BasePurchase; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: purchase + * Remarks: 基础配置 - 采购点(采砂场) + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Purchase extends BasePurchase { + public static final Purchase dao = new Purchase().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetail.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetail.java new file mode 100644 index 0000000..e67648e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetail.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseRefundDetail; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: refund_detail + * Remarks: 客户相关 - 客户预付费退费记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class RefundDetail extends BaseRefundDetail { + public static final RefundDetail dao = new RefundDetail().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetailStateHistory.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetailStateHistory.java new file mode 100644 index 0000000..2eb1fea --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/RefundDetailStateHistory.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseRefundDetailStateHistory; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: refund_detail_state_history + * Remarks: 客户相关 - 客户预付费退费记录状态变化日志 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class RefundDetailStateHistory extends BaseRefundDetailStateHistory { + public static final RefundDetailStateHistory dao = new RefundDetailStateHistory().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Sandfarm.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Sandfarm.java new file mode 100644 index 0000000..61fa227 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Sandfarm.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseSandfarm; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: sandfarm + * Remarks: 基础配置 - 生产点(采砂场) + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Sandfarm extends BaseSandfarm { + public static final Sandfarm dao = new Sandfarm().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Stock.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Stock.java new file mode 100644 index 0000000..5d08144 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Stock.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseStock; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: stock + * Remarks: 订单相关 - 销售点库存量 + * PrimaryKey: supermarket_id + */ +@SuppressWarnings("serial") +public class Stock extends BaseStock { + public static final Stock dao = new Stock().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/StockModifyLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/StockModifyLog.java new file mode 100644 index 0000000..da9e993 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/StockModifyLog.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseStockModifyLog; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: stock_modify_log + * Remarks: 订单相关 - 手动修改库存记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class StockModifyLog extends BaseStockModifyLog { + public static final StockModifyLog dao = new StockModifyLog().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Supermarket.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Supermarket.java new file mode 100644 index 0000000..7823b3c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Supermarket.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseSupermarket; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: supermarket + * Remarks: 基础配置 - 销售点(超市) + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Supermarket extends BaseSupermarket { + public static final Supermarket dao = new Supermarket().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketProduct.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketProduct.java new file mode 100644 index 0000000..db342c0 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketProduct.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseSupermarketProduct; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: supermarket_product + * Remarks: 基础配置 - 超市关联 product 表 + * PrimaryKey: supermarket_id,product_id + */ +@SuppressWarnings("serial") +public class SupermarketProduct extends BaseSupermarketProduct { + public static final SupermarketProduct dao = new SupermarketProduct().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketReceiverDistance.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketReceiverDistance.java new file mode 100644 index 0000000..0f5e6ec --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketReceiverDistance.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseSupermarketReceiverDistance; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: supermarket_receiver_distance + * Remarks: 基础配置 - 客户收获地址到每个超市的距离 + * PrimaryKey: supermarket_id,customer_receiver_id + */ +@SuppressWarnings("serial") +public class SupermarketReceiverDistance extends BaseSupermarketReceiverDistance { + public static final SupermarketReceiverDistance dao = new SupermarketReceiverDistance().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketSandfarmDistance.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketSandfarmDistance.java new file mode 100644 index 0000000..01a6589 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/SupermarketSandfarmDistance.java @@ -0,0 +1,15 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseSupermarketSandfarmDistance; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: supermarket_sandfarm_distance + * Remarks: 基础配置 - 生产点到销售点的距离配置 + + * PrimaryKey: supermarket_id,sandfarm_id + */ +@SuppressWarnings("serial") +public class SupermarketSandfarmDistance extends BaseSupermarketSandfarmDistance { + public static final SupermarketSandfarmDistance dao = new SupermarketSandfarmDistance().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java new file mode 100644 index 0000000..16a20a8 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/SyncTask.java @@ -0,0 +1,63 @@ +package com.cowr.model; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.cowr.common.base.BaseModel; +import com.cowr.model.base.BaseSyncTask; +import com.jfinal.kit.StrKit; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: sync_task + * Remarks: 日志相关 - 数据同步 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class SyncTask extends BaseSyncTask { + public static final SyncTask dao = new SyncTask().dao(); + + private JSONObject _save_data = new JSONObject(); + private JSONObject _update_data = new JSONObject(); + private JSONObject _delete_data = new JSONObject(); + + private SyncTask add(JSONObject obj, BaseModel model){ + String key = model.getTablename(); + + if(!obj.containsKey(key)){ + JSONObject data = new JSONObject(); + data.put("pks", StrKit.join(model.getPKey(), ",")); + data.put("data", new JSONArray()); + + obj.put(key, data); + } + + obj.getJSONObject(key).getJSONArray("data").add(model); + + return this; + } + + public SyncTask addSaveData(BaseModel model){ + return add(_save_data, model); + } + + public SyncTask addUpdateData(BaseModel model){ + return add(_update_data, model); + } + + public SyncTask addDeleteData(BaseModel model){ + return add(_delete_data, model); + } + + public void setJson(){ + if(!_save_data.isEmpty() && this.getSaveData() == null){ + this.setSaveData(JSONObject.toJSONString(_save_data, SerializerFeature.WriteDateUseDateFormat)); // 新增的数据,就不要发送 null 值了 + } + if(!_update_data.isEmpty() && this.getUpdateData() == null){ // 修改的数据,可以发送 null,有的字段要设置为 null + this.setUpdateData(JSONObject.toJSONString(_update_data, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat)); + } + if(!_delete_data.isEmpty() && this.getDeleteData() == null){ + this.setDeleteData(JSONObject.toJSONString(_delete_data, SerializerFeature.WriteDateUseDateFormat)); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Sysuser.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Sysuser.java new file mode 100644 index 0000000..b9efaf7 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Sysuser.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseSysuser; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: sysuser + * Remarks: 用户管理 - 系统登陆账号 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Sysuser extends BaseSysuser { + public static final Sysuser dao = new Sysuser().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigSale.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigSale.java new file mode 100644 index 0000000..c69ed7f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigSale.java @@ -0,0 +1,15 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTransPriceConfigSale; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: trans_price_config_sale + * Remarks: 系统配置 - 销售运费配置信息 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class TransPriceConfigSale extends BaseTransPriceConfigSale { + public static final TransPriceConfigSale dao = new TransPriceConfigSale().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTransfer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTransfer.java new file mode 100644 index 0000000..bf3b392 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTransfer.java @@ -0,0 +1,15 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTransPriceConfigTransfer; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: trans_price_config_transfer + * Remarks: 系统配置 - 转运运费配置信息 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class TransPriceConfigTransfer extends BaseTransPriceConfigTransfer { + public static final TransPriceConfigTransfer dao = new TransPriceConfigTransfer().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTrash.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTrash.java new file mode 100644 index 0000000..88d54cd --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransPriceConfigTrash.java @@ -0,0 +1,15 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTransPriceConfigTrash; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: trans_price_config_trash + * Remarks: 系统配置 - 废料运费配置信息 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class TransPriceConfigTrash extends BaseTransPriceConfigTrash { + public static final TransPriceConfigTrash dao = new TransPriceConfigTrash().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Transport.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Transport.java new file mode 100644 index 0000000..e569200 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Transport.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTransport; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: transport + * Remarks: 订单相关 - 出入场记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class Transport extends BaseTransport { + public static final Transport dao = new Transport().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/TransportCompany.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransportCompany.java new file mode 100644 index 0000000..87db0f5 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/TransportCompany.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTransportCompany; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: transport_company + * Remarks: 基础配置 - 物流公司 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public class TransportCompany extends BaseTransportCompany { + public static final TransportCompany dao = new TransportCompany().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/Truck.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/Truck.java new file mode 100644 index 0000000..cfa48d8 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/Truck.java @@ -0,0 +1,14 @@ +package com.cowr.model; + +import com.cowr.model.base.BaseTruck; + +/** + * Generated by COWR Sun Apr 12 21:56:10 CST 2020 + * TableName: truck + * Remarks: 基础配置 - 运输车辆信息 + * PrimaryKey: license + */ +@SuppressWarnings("serial") +public class Truck extends BaseTruck { + public static final Truck dao = new Truck().dao(); +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java new file mode 100644 index 0000000..67d1b8c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/_MappingKit.java @@ -0,0 +1,72 @@ +package com.cowr.model; + +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; + +/** + * Generated by COWR Sun May 17 21:43:18 CST 2020 + *
+ * Example:
+ * public void configPlugin(Plugins me) {
+ *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
+ *     _MappingKit.mapping(arp);
+ *     me.add(arp);
+ * }
+ * 
+ */ +public class _MappingKit { + + public static void mapping(ActiveRecordPlugin arp) { + arp.addMapping("auth_license", "truck_license", AuthLicense.class); + arp.addMapping("bocomm", "id", Bocomm.class); + arp.addMapping("bocomm_request", "id", BocommRequest.class); + arp.addMapping("bocomm_response", "id", BocommResponse.class); + arp.addMapping("transport", "id", Transport.class); + arp.addMapping("device_config", "supermarket_id", DeviceConfig.class); + arp.addMapping("driver", "id", Driver.class); + arp.addMapping("product", "id", Product.class); + // Composite Primary Key order: supermarket_id,customer_receiver_id + arp.addMapping("supermarket_receiver_distance", "supermarket_id,customer_receiver_id", SupermarketReceiverDistance.class); + arp.addMapping("transport_company", "id", TransportCompany.class); + // Composite Primary Key order: supermarket_id,sandfarm_id + arp.addMapping("supermarket_sandfarm_distance", "supermarket_id,sandfarm_id", SupermarketSandfarmDistance.class); + arp.addMapping("sandfarm", "id", Sandfarm.class); + // Composite Primary Key order: supermarket_id,product_id + arp.addMapping("supermarket_product", "supermarket_id,product_id", SupermarketProduct.class); + arp.addMapping("blacklist", "id", Blacklist.class); + arp.addMapping("truck", "license", Truck.class); + arp.addMapping("purchase", "id", Purchase.class); + arp.addMapping("supermarket", "id", Supermarket.class); + arp.addMapping("customer", "id", Customer.class); + arp.addMapping("customer_receiver", "id", CustomerReceiver.class); + arp.addMapping("customer_contact", "id", CustomerContact.class); + arp.addMapping("prepay_detail", "id", PrepayDetail.class); + arp.addMapping("prepay_detail_state_history", "id", PrepayDetailStateHistory.class); + arp.addMapping("refund_detail", "id", RefundDetail.class); + arp.addMapping("refund_detail_state_history", "id", RefundDetailStateHistory.class); + arp.addMapping("prepay_customer", "id", PrepayCustomer.class); + arp.addMapping("prepay_truck", "id", PrepayTruck.class); + arp.addMapping("sync_task", "id", SyncTask.class); + arp.addMapping("modify_log", "id", ModifyLog.class); + arp.addMapping("action_cmd_log", "id", ActionCmdLog.class); + arp.addMapping("sysuser", "id", Sysuser.class); + arp.addMapping("trans_price_config_trash", "id", TransPriceConfigTrash.class); + arp.addMapping("trans_price_config_transfer", "id", TransPriceConfigTransfer.class); + arp.addMapping("trans_price_config_sale", "id", TransPriceConfigSale.class); + // Composite Primary Key order: unit_id,unit_type + arp.addMapping("cctv", "unit_id,unit_type", Cctv.class); + // Composite Primary Key order: id,unit_id,unit_type + arp.addMapping("cctv_channels", "id,unit_id,unit_type", CctvChannels.class); + arp.addMapping("order_purchase", "sn", OrderPurchase.class); + arp.addMapping("order_temp", "sn", OrderTemp.class); + // Composite Primary Key order: tm,supermarket_id,type + arp.addMapping("order_seq", "tm,supermarket_id,type", OrderSeq.class); + arp.addMapping("order_trash", "sn", OrderTrash.class); + arp.addMapping("stock_modify_log", "id", StockModifyLog.class); + arp.addMapping("ordercluster", "id", Ordercluster.class); + arp.addMapping("order_transfer", "sn", OrderTransfer.class); + arp.addMapping("order_sale", "sn", OrderSale.class); + // Composite Primary Key order: supermarket_id,product_id + arp.addMapping("stock", "supermarket_id,product_id", Stock.class); + } +} + diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseActionCmdLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseActionCmdLog.java new file mode 100644 index 0000000..24cdb86 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseActionCmdLog.java @@ -0,0 +1,134 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: action_cmd_log + * Remarks: 日志相关- 硬件操作指令日志 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseActionCmdLog> extends BaseModel implements IBean { + + public static final String tablename = "action_cmd_log"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: BIGINT(19) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Long id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Long getId() { + return getLong("id"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId 创建用户id + */ + @JSONField(name="create_user_id") + public void setCreateUserId(java.lang.Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id 创建用户id + */ + @JSONField(name="create_user_id") + public java.lang.Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(java.lang.String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public java.lang.String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: create_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param createTime 最后修改时间 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 最后修改时间 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: content + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param content 指令内容 + */ + @JSONField(name="content") + public void setContent(java.lang.String content) { + set("content", content); + } + + + /** + * @return content 指令内容 + */ + @JSONField(name="content") + public java.lang.String getContent() { + return getStr("content"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseAuthLicense.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseAuthLicense.java new file mode 100644 index 0000000..35fba00 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseAuthLicense.java @@ -0,0 +1,68 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Sun Jun 21 00:41:02 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +@SuppressWarnings("serial") +public abstract class BaseAuthLicense> extends BaseModel implements IBean { + + public static final String tablename = "auth_license"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param truckLicense + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: create_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param createTime 加入时间 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 加入时间 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBlacklist.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBlacklist.java new file mode 100644 index 0000000..73bbc31 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBlacklist.java @@ -0,0 +1,270 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: blacklist + * Remarks: 基础配置 - 车辆黑名单 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseBlacklist> extends BaseModel implements IBean { + + public static final String tablename = "blacklist"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id 使用uuid + */ + @JSONField(name="id") + public void setId(java.lang.String id) { + set("id", id); + } + + + /** + * @return id 使用uuid + */ + @JSONField(name="id") + public java.lang.String getId() { + return getStr("id"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(java.lang.String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public java.lang.String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: driver_name + * type: VARCHAR(8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param driverName 司机姓名 + */ + @JSONField(name="driver_name") + public void setDriverName(java.lang.String driverName) { + set("driver_name", driverName); + } + + + /** + * @return driver_name 司机姓名 + */ + @JSONField(name="driver_name") + public java.lang.String getDriverName() { + return getStr("driver_name"); + } + + /** + * name: driver_phone + * type: VARCHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param driverPhone 司机手机号 + */ + @JSONField(name="driver_phone") + public void setDriverPhone(java.lang.String driverPhone) { + set("driver_phone", driverPhone); + } + + + /** + * @return driver_phone 司机手机号 + */ + @JSONField(name="driver_phone") + public java.lang.String getDriverPhone() { + return getStr("driver_phone"); + } + + /** + * name: order_sn + * type: VARCHAR(16) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param orderSn 关联的订单 + */ + @JSONField(name="order_sn") + public void setOrderSn(java.lang.String orderSn) { + set("order_sn", orderSn); + } + + + /** + * @return order_sn 关联的订单 + */ + @JSONField(name="order_sn") + public java.lang.String getOrderSn() { + return getStr("order_sn"); + } + + /** + * name: set_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param setTime + */ + @JSONField(name="set_time") + public void setSetTime(java.util.Date setTime) { + set("set_time", setTime); + } + + + /** + * @return set_time + */ + @JSONField(name="set_time") + public java.util.Date getSetTime() { + return get("set_time"); + } + + /** + * name: set_user_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param setUserId + */ + @JSONField(name="set_user_id") + public void setSetUserId(java.lang.Integer setUserId) { + set("set_user_id", setUserId); + } + + + /** + * @return set_user_id + */ + @JSONField(name="set_user_id") + public java.lang.Integer getSetUserId() { + return getInt("set_user_id"); + } + + /** + * name: remove_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param removeTime + */ + @JSONField(name="remove_time") + public void setRemoveTime(java.util.Date removeTime) { + set("remove_time", removeTime); + } + + + /** + * @return remove_time + */ + @JSONField(name="remove_time") + public java.util.Date getRemoveTime() { + return get("remove_time"); + } + + /** + * name: remove_user_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param removeUserId remove_user_id 为空的,表示该车辆还在黑名单中,不能进场 + */ + @JSONField(name="remove_user_id") + public void setRemoveUserId(java.lang.Integer removeUserId) { + set("remove_user_id", removeUserId); + } + + + /** + * @return remove_user_id remove_user_id 为空的,表示该车辆还在黑名单中,不能进场 + */ + @JSONField(name="remove_user_id") + public java.lang.Integer getRemoveUserId() { + return getInt("remove_user_id"); + } + + /** + * name: reason_type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param reasonType 1,不服从管理 +2,舞弊行为 +9,其他 + */ + @JSONField(name="reason_type") + public void setReasonType(java.lang.Integer reasonType) { + set("reason_type", reasonType); + } + + + /** + * @return reason_type 1,不服从管理 +2,舞弊行为 +9,其他 + */ + @JSONField(name="reason_type") + public java.lang.Integer getReasonType() { + return getInt("reason_type"); + } + + /** + * name: reason_detail + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param reasonDetail + */ + @JSONField(name="reason_detail") + public void setReasonDetail(java.lang.String reasonDetail) { + set("reason_detail", reasonDetail); + } + + + /** + * @return reason_detail + */ + @JSONField(name="reason_detail") + public java.lang.String getReasonDetail() { + return getStr("reason_detail"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocomm.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocomm.java new file mode 100644 index 0000000..0a0a155 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocomm.java @@ -0,0 +1,592 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Wed Jun 24 01:50:19 CST 2020 + * TableName: bocomm + * Remarks: 支付相关 - 交行支付记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseBocomm> extends BaseModel implements IBean { + + public static final String tablename = "bocomm"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: uuid + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param uuid 前端提供uuid,避免重复提交 + */ + @JSONField(name="uuid") + public void setUuid(String uuid) { + set("uuid", uuid); + } + + + /** + * @return uuid 前端提供uuid,避免重复提交 + */ + @JSONField(name="uuid") + public String getUuid() { + return getStr("uuid"); + } + + /** + * name: order_sn + * type: CHAR(16) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param orderSn 系统订单号, xml 中用 PayMerTranNo + */ + @JSONField(name="order_sn") + public void setOrderSn(String orderSn) { + set("order_sn", orderSn); + } + + + /** + * @return order_sn 系统订单号, xml 中用 PayMerTranNo + */ + @JSONField(name="order_sn") + public String getOrderSn() { + return getStr("order_sn"); + } + + /** + * name: type + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param type 订单类型 1销售订单,3临时订单 + */ + @JSONField(name="type") + public void setType(Integer type) { + set("type", type); + } + + + /** + * @return type 订单类型 1销售订单,3临时订单 + */ + @JSONField(name="type") + public Integer getType() { + return getInt("type"); + } + + /** + * name: paymertranno + * type: VARCHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param paymertranno 给银行的订单号, order_sn + HHmmssSSS + */ + @JSONField(name="paymertranno") + public void setPaymertranno(String paymertranno) { + set("paymertranno", paymertranno); + } + + + /** + * @return paymertranno 给银行的订单号, order_sn + HHmmssSSS + */ + @JSONField(name="paymertranno") + public String getPaymertranno() { + return getStr("paymertranno"); + } + + /** + * name: amount + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param amount 支付金额 + */ + @JSONField(name="amount") + public void setAmount(java.math.BigDecimal amount) { + set("amount", amount); + } + + + /** + * @return amount 支付金额 + */ + @JSONField(name="amount") + public java.math.BigDecimal getAmount() { + return get("amount"); + } + + /** + * name: transcene + * type: VARCHAR(20) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transcene 支付场景 +B2C-JSAPI-ALIPAY 支付宝内置浏览器 +B2C-JSAPI-WECHAT 微信内置浏览器 + */ + @JSONField(name="transcene") + public void setTranscene(String transcene) { + set("transcene", transcene); + } + + + /** + * @return transcene 支付场景 +B2C-JSAPI-ALIPAY 支付宝内置浏览器 +B2C-JSAPI-WECHAT 微信内置浏览器 + */ + @JSONField(name="transcene") + public String getTranscene() { + return getStr("transcene"); + } + + /** + * name: validperiod + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param validperiod 非空,日期时间14位 + */ + @JSONField(name="validperiod") + public void setValidperiod(java.util.Date validperiod) { + set("validperiod", validperiod); + } + + + /** + * @return validperiod 非空,日期时间14位 + */ + @JSONField(name="validperiod") + public java.util.Date getValidperiod() { + return get("validperiod"); + } + + /** + * name: state + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 1.创建记录,返回关联的加签信息给前台,最后不一定使用 +2.提交跳转,前端提交跳转操作,同时跳转到交行支付连接 +3.收到通知,不是成功的通知 +5.收到支付成功的通知 +9.作废,超时或者其他情况作废 + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 1.创建记录,返回关联的加签信息给前台,最后不一定使用 +2.提交跳转,前端提交跳转操作,同时跳转到交行支付连接 +3.收到通知,不是成功的通知 +5.收到支付成功的通知 +9.作废,超时或者其他情况作废 + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: transtate + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transtate INITIAL:订单创建 +PROCESS:处理中 +SUCCESS:交易成功 +FAILURE 交易失败 + */ + @JSONField(name="transtate") + public void setTranstate(String transtate) { + set("transtate", transtate); + } + + + /** + * @return transtate INITIAL:订单创建 +PROCESS:处理中 +SUCCESS:交易成功 +FAILURE 交易失败 + */ + @JSONField(name="transtate") + public String getTranstate() { + return getStr("transtate"); + } + + /** + * name: transtatecode + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transtatecode 交易失败原因错误码 + */ + @JSONField(name="transtatecode") + public void setTranstatecode(String transtatecode) { + set("transtatecode", transtatecode); + } + + + /** + * @return transtatecode 交易失败原因错误码 + */ + @JSONField(name="transtatecode") + public String getTranstatecode() { + return getStr("transtatecode"); + } + + /** + * name: transtatemsg + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transtatemsg 交易失败原因说明 + */ + @JSONField(name="transtatemsg") + public void setTranstatemsg(String transtatemsg) { + set("transtatemsg", transtatemsg); + } + + + /** + * @return transtatemsg 交易失败原因说明 + */ + @JSONField(name="transtatemsg") + public String getTranstatemsg() { + return getStr("transtatemsg"); + } + + /** + * name: batchno + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param batchno 交行批次号,交易所属交行批次,交易成功的交易才有该字段。 + */ + @JSONField(name="batchno") + public void setBatchno(String batchno) { + set("batchno", batchno); + } + + + /** + * @return batchno 交行批次号,交易所属交行批次,交易成功的交易才有该字段。 + */ + @JSONField(name="batchno") + public String getBatchno() { + return getStr("batchno"); + } + + /** + * name: finaltime + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param finaltime 最终变成成功或失败的时间 + */ + @JSONField(name="finaltime") + public void setFinaltime(java.util.Date finaltime) { + set("finaltime", finaltime); + } + + + /** + * @return finaltime 最终变成成功或失败的时间 + */ + @JSONField(name="finaltime") + public java.util.Date getFinaltime() { + return get("finaltime"); + } + + /** + * name: trancontent + * type: VARCHAR(500) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param trancontent 交易内容,展示给客户,可查询 + */ + @JSONField(name="trancontent") + public void setTrancontent(String trancontent) { + set("trancontent", trancontent); + } + + + /** + * @return trancontent 交易内容,展示给客户,可查询 + */ + @JSONField(name="trancontent") + public String getTrancontent() { + return getStr("trancontent"); + } + + /** + * name: mermemo + * type: VARCHAR(200) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param mermemo 商户内部备注,不展示给客户,可查询 + */ + @JSONField(name="mermemo") + public void setMermemo(String mermemo) { + set("mermemo", mermemo); + } + + + /** + * @return mermemo 商户内部备注,不展示给客户,可查询 + */ + @JSONField(name="mermemo") + public String getMermemo() { + return getStr("mermemo"); + } + + /** + * name: subopenid + * type: VARCHAR(100) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param subopenid + */ + @JSONField(name="subopenid") + public void setSubopenid(String subopenid) { + set("subopenid", subopenid); + } + + + /** + * @return subopenid + */ + @JSONField(name="subopenid") + public String getSubopenid() { + return getStr("subopenid"); + } + + /** + * name: banktranno + * type: VARCHAR(100) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param banktranno + */ + @JSONField(name="banktranno") + public void setBanktranno(String banktranno) { + set("banktranno", banktranno); + } + + + /** + * @return banktranno + */ + @JSONField(name="banktranno") + public String getBanktranno() { + return getStr("banktranno"); + } + + /** + * name: thirdparty + * type: VARCHAR(100) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param thirdparty + */ + @JSONField(name="thirdparty") + public void setThirdparty(String thirdparty) { + set("thirdparty", thirdparty); + } + + + /** + * @return thirdparty + */ + @JSONField(name="thirdparty") + public String getThirdparty() { + return getStr("thirdparty"); + } + + /** + * name: thirdpartytranno + * type: VARCHAR(100) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param thirdpartytranno + */ + @JSONField(name="thirdpartytranno") + public void setThirdpartytranno(String thirdpartytranno) { + set("thirdpartytranno", thirdpartytranno); + } + + + /** + * @return thirdpartytranno + */ + @JSONField(name="thirdpartytranno") + public String getThirdpartytranno() { + return getStr("thirdpartytranno"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createTime + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: payacctno + * type: VARCHAR(100) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param payacctno 付款人账号 + */ + @JSONField(name="payacctno") + public void setPayacctno(String payacctno) { + set("payacctno", payacctno); + } + + + /** + * @return payacctno 付款人账号 + */ + @JSONField(name="payacctno") + public String getPayacctno() { + return getStr("payacctno"); + } + + /** + * name: payacctname + * type: VARCHAR(100) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param payacctname 付款人姓名 + */ + @JSONField(name="payacctname") + public void setPayacctname(String payacctname) { + set("payacctname", payacctname); + } + + + /** + * @return payacctname 付款人姓名 + */ + @JSONField(name="payacctname") + public String getPayacctname() { + return getStr("payacctname"); + } + + /** + * name: submerptcid + * type: VARCHAR(100) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param submerptcid SubMerPtcId + */ + @JSONField(name="submerptcid") + public void setSubmerptcid(String submerptcid) { + set("submerptcid", submerptcid); + } + + + /** + * @return submerptcid SubMerPtcId + */ + @JSONField(name="submerptcid") + public String getSubmerptcid() { + return getStr("submerptcid"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommRequest.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommRequest.java new file mode 100644 index 0000000..f7e362a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommRequest.java @@ -0,0 +1,112 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri May 29 11:23:08 CST 2020 + * TableName: bocomm_request + * Remarks: 支付相关 - 交行请求(提交到交行的)报文 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseBocommRequest> extends BaseModel implements IBean { + + public static final String tablename = "bocomm_request"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: bocomm_id + * type: CHAR(32) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param bocommId bocomm 表id + */ + @JSONField(name="bocomm_id") + public void setBocommId(String bocommId) { + set("bocomm_id", bocommId); + } + + + /** + * @return bocomm_id bocomm 表id + */ + @JSONField(name="bocomm_id") + public String getBocommId() { + return getStr("bocomm_id"); + } + + /** + * name: trancode + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param trancode 交易码 + */ + @JSONField(name="trancode") + public void setTrancode(String trancode) { + set("trancode", trancode); + } + + + /** + * @return trancode 交易码 + */ + @JSONField(name="trancode") + public String getTrancode() { + return getStr("trancode"); + } + + /** + * name: xml + * type: VARCHAR(1000) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param xml 请求xml + */ + @JSONField(name="xml") + public void setXml(String xml) { + set("xml", xml); + } + + + /** + * @return xml 请求xml + */ + @JSONField(name="xml") + public String getXml() { + return getStr("xml"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommResponse.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommResponse.java new file mode 100644 index 0000000..4cf7c8e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseBocommResponse.java @@ -0,0 +1,112 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri May 29 11:23:08 CST 2020 + * TableName: bocomm_response + * Remarks: 支付相关 - 交行响应(推送过来的)报文 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseBocommResponse> extends BaseModel implements IBean { + + public static final String tablename = "bocomm_response"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: bocomm_id + * type: CHAR(32) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param bocommId bocomm 表id + */ + @JSONField(name="bocomm_id") + public void setBocommId(String bocommId) { + set("bocomm_id", bocommId); + } + + + /** + * @return bocomm_id bocomm 表id + */ + @JSONField(name="bocomm_id") + public String getBocommId() { + return getStr("bocomm_id"); + } + + /** + * name: trancode + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param trancode 交易码 + */ + @JSONField(name="trancode") + public void setTrancode(String trancode) { + set("trancode", trancode); + } + + + /** + * @return trancode 交易码 + */ + @JSONField(name="trancode") + public String getTrancode() { + return getStr("trancode"); + } + + /** + * name: xml + * type: VARCHAR(1000) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param xml 响应xml + */ + @JSONField(name="xml") + public void setXml(String xml) { + set("xml", xml); + } + + + /** + * @return xml 响应xml + */ + @JSONField(name="xml") + public String getXml() { + return getStr("xml"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctv.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctv.java new file mode 100644 index 0000000..5812805 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctv.java @@ -0,0 +1,222 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: cctv + * Remarks: 视频监控(硬盘录像机)信息 + * PrimaryKey: unit_id,unit_type + */ +@SuppressWarnings("serial") +public abstract class BaseCctv> extends BaseModel implements IBean { + + public static final String tablename = "cctv"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: unit_id + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param unitId id + */ + @JSONField(name="unit_id") + public void setUnitId(java.lang.String unitId) { + set("unit_id", unitId); + } + + + /** + * @return unit_id id + */ + @JSONField(name="unit_id") + public java.lang.String getUnitId() { + return getStr("unit_id"); + } + + /** + * name: unit_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param unitName 名称 + */ + @JSONField(name="unit_name") + public void setUnitName(java.lang.String unitName) { + set("unit_name", unitName); + } + + + /** + * @return unit_name 名称 + */ + @JSONField(name="unit_name") + public java.lang.String getUnitName() { + return getStr("unit_name"); + } + + /** + * name: unit_type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param unitType 监控对象,1.销售点、2.生产点 + */ + @JSONField(name="unit_type") + public void setUnitType(java.lang.Integer unitType) { + set("unit_type", unitType); + } + + + /** + * @return unit_type 监控对象,1.销售点、2.生产点 + */ + @JSONField(name="unit_type") + public java.lang.Integer getUnitType() { + return getInt("unit_type"); + } + + /** + * name: ip + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param ip 外网ip + */ + @JSONField(name="ip") + public void setIp(java.lang.String ip) { + set("ip", ip); + } + + + /** + * @return ip 外网ip + */ + @JSONField(name="ip") + public java.lang.String getIp() { + return getStr("ip"); + } + + /** + * name: Intranet_ip + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param intranetIp 内网ip + */ + @JSONField(name="Intranet_ip") + public void setIntranetIp(java.lang.String intranetIp) { + set("Intranet_ip", intranetIp); + } + + + /** + * @return Intranet_ip 内网ip + */ + @JSONField(name="Intranet_ip") + public java.lang.String getIntranetIp() { + return getStr("Intranet_ip"); + } + + /** + * name: port + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param port 外网端口 + */ + @JSONField(name="port") + public void setPort(java.lang.Integer port) { + set("port", port); + } + + + /** + * @return port 外网端口 + */ + @JSONField(name="port") + public java.lang.Integer getPort() { + return getInt("port"); + } + + /** + * name: Intranet_port + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param intranetPort 内网端口 + */ + @JSONField(name="Intranet_port") + public void setIntranetPort(java.lang.String intranetPort) { + set("Intranet_port", intranetPort); + } + + + /** + * @return Intranet_port 内网端口 + */ + @JSONField(name="Intranet_port") + public java.lang.String getIntranetPort() { + return getStr("Intranet_port"); + } + + /** + * name: u + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param u 硬盘录像机账号 + */ + @JSONField(name="u") + public void setU(java.lang.String u) { + set("u", u); + } + + + /** + * @return u 硬盘录像机账号 + */ + @JSONField(name="u") + public java.lang.String getU() { + return getStr("u"); + } + + /** + * name: p + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param p 硬盘录像机密码 + */ + @JSONField(name="p") + public void setP(java.lang.String p) { + set("p", p); + } + + + /** + * @return p 硬盘录像机密码 + */ + @JSONField(name="p") + public java.lang.String getP() { + return getStr("p"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctvChannels.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctvChannels.java new file mode 100644 index 0000000..d2b4ac3 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCctvChannels.java @@ -0,0 +1,134 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: cctv_channels + * Remarks: 视频监控(硬盘录像机)通道信息 + * PrimaryKey: id,unit_id,unit_type + */ +@SuppressWarnings("serial") +public abstract class BaseCctvChannels> extends BaseModel implements IBean { + + public static final String tablename = "cctv_channels"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id 通道id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id 通道id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: unit_id + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param unitId 超市id,砂场id前加 s + */ + @JSONField(name="unit_id") + public void setUnitId(java.lang.String unitId) { + set("unit_id", unitId); + } + + + /** + * @return unit_id 超市id,砂场id前加 s + */ + @JSONField(name="unit_id") + public java.lang.String getUnitId() { + return getStr("unit_id"); + } + + /** + * name: name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param name 名称 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 名称 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: default_select + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param defaultSelect 是否默认选中 + */ + @JSONField(name="default_select") + public void setDefaultSelect(java.lang.Integer defaultSelect) { + set("default_select", defaultSelect); + } + + + /** + * @return default_select 是否默认选中 + */ + @JSONField(name="default_select") + public java.lang.Integer getDefaultSelect() { + return getInt("default_select"); + } + + /** + * name: unit_type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param unitType 监控对象,1.销售点、2.生产点 + */ + @JSONField(name="unit_type") + public void setUnitType(java.lang.Integer unitType) { + set("unit_type", unitType); + } + + + /** + * @return unit_type 监控对象,1.销售点、2.生产点 + */ + @JSONField(name="unit_type") + public java.lang.Integer getUnitType() { + return getInt("unit_type"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomer.java new file mode 100644 index 0000000..b8e56c5 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomer.java @@ -0,0 +1,266 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Sun May 17 21:43:18 CST 2020 + * TableName: customer + * Remarks: 客户相关 - 客户 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseCustomer> extends BaseModel implements IBean { + + public static final String tablename = "customer"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public Integer getId() { + return getInt("id"); + } + + /** + * name: name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name + */ + @JSONField(name="name") + public void setName(String name) { + set("name", name); + } + + + /** + * @return name + */ + @JSONField(name="name") + public String getName() { + return getStr("name"); + } + + /** + * name: address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param address 开票地址 + */ + @JSONField(name="address") + public void setAddress(String address) { + set("address", address); + } + + + /** + * @return address 开票地址 + */ + @JSONField(name="address") + public String getAddress() { + return getStr("address"); + } + + /** + * name: phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param phone 开票电话 + */ + @JSONField(name="phone") + public void setPhone(String phone) { + set("phone", phone); + } + + + /** + * @return phone 开票电话 + */ + @JSONField(name="phone") + public String getPhone() { + return getStr("phone"); + } + + /** + * name: texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param texpayerName 开票公司名称 + */ + @JSONField(name="texpayer_name") + public void setTexpayerName(String texpayerName) { + set("texpayer_name", texpayerName); + } + + + /** + * @return texpayer_name 开票公司名称 + */ + @JSONField(name="texpayer_name") + public String getTexpayerName() { + return getStr("texpayer_name"); + } + + /** + * name: texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param texpayerNum 税号 + */ + @JSONField(name="texpayer_num") + public void setTexpayerNum(String texpayerNum) { + set("texpayer_num", texpayerNum); + } + + + /** + * @return texpayer_num 税号 + */ + @JSONField(name="texpayer_num") + public String getTexpayerNum() { + return getStr("texpayer_num"); + } + + /** + * name: bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param bankName 开户行名称 + */ + @JSONField(name="bank_name") + public void setBankName(String bankName) { + set("bank_name", bankName); + } + + + /** + * @return bank_name 开户行名称 + */ + @JSONField(name="bank_name") + public String getBankName() { + return getStr("bank_name"); + } + + /** + * name: bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param bankAccount 开户行账号 + */ + @JSONField(name="bank_account") + public void setBankAccount(String bankAccount) { + set("bank_account", bankAccount); + } + + + /** + * @return bank_account 开户行账号 + */ + @JSONField(name="bank_account") + public String getBankAccount() { + return getStr("bank_account"); + } + + /** + * name: memo + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo + */ + @JSONField(name="memo") + public void setMemo(String memo) { + set("memo", memo); + } + + + /** + * @return memo + */ + @JSONField(name="memo") + public String getMemo() { + return getStr("memo"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del + */ + @JSONField(name="del") + public void setDel(Integer del) { + set("del", del); + } + + + /** + * @return del + */ + @JSONField(name="del") + public Integer getDel() { + return getInt("del"); + } + + /** + * name: type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param type 是否预付费客户,0.不是,1.是 + */ + @JSONField(name="type") + public void setType(Integer type) { + set("type", type); + } + + + /** + * @return type 是否预付费客户,0.不是,1.是 + */ + @JSONField(name="type") + public Integer getType() { + return getInt("type"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerContact.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerContact.java new file mode 100644 index 0000000..2be965d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerContact.java @@ -0,0 +1,111 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: customer_contact + * Remarks: 客户相关 - 客户联系人 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseCustomerContact> extends BaseModel implements IBean { + + public static final String tablename = "customer_contact"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerId 客户id + */ + @JSONField(name="customer_id") + public void setCustomerId(java.lang.Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id 客户id + */ + @JSONField(name="customer_id") + public java.lang.Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: name + * type: VARCHAR(100) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name 姓名 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 姓名 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: phone + * type: VARCHAR(11) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param phone 电话 + */ + @JSONField(name="phone") + public void setPhone(java.lang.String phone) { + set("phone", phone); + } + + + /** + * @return phone 电话 + */ + @JSONField(name="phone") + public java.lang.String getPhone() { + return getStr("phone"); + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerReceiver.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerReceiver.java new file mode 100644 index 0000000..49323a5 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseCustomerReceiver.java @@ -0,0 +1,221 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: customer_receiver + * Remarks: 客户相关 - 客户收获地址 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseCustomerReceiver> extends BaseModel implements IBean { + + public static final String tablename = "customer_receiver"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerId + */ + @JSONField(name="customer_id") + public void setCustomerId(java.lang.Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id + */ + @JSONField(name="customer_id") + public java.lang.Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name 收货人姓名 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 收货人姓名 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: phone + * type: CHAR(11) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param phone 收货人电话 + */ + @JSONField(name="phone") + public void setPhone(java.lang.String phone) { + set("phone", phone); + } + + + /** + * @return phone 收货人电话 + */ + @JSONField(name="phone") + public java.lang.String getPhone() { + return getStr("phone"); + } + + /** + * name: address + * type: VARCHAR(256) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param address 收货地址 + */ + @JSONField(name="address") + public void setAddress(java.lang.String address) { + set("address", address); + } + + + /** + * @return address 收货地址 + */ + @JSONField(name="address") + public java.lang.String getAddress() { + return getStr("address"); + } + + /** + * name: lgtd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lgtd 收货经度 + */ + @JSONField(name="lgtd") + public void setLgtd(java.math.BigDecimal lgtd) { + set("lgtd", lgtd); + } + + + /** + * @return lgtd 收货经度 + */ + @JSONField(name="lgtd") + public java.math.BigDecimal getLgtd() { + return get("lgtd"); + } + + /** + * name: lttd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lttd 收货纬度 + */ + @JSONField(name="lttd") + public void setLttd(java.math.BigDecimal lttd) { + set("lttd", lttd); + } + + + /** + * @return lttd 收货纬度 + */ + @JSONField(name="lttd") + public java.math.BigDecimal getLttd() { + return get("lttd"); + } + + /** + * name: memo + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo 欸住 + */ + @JSONField(name="memo") + public void setMemo(java.lang.String memo) { + set("memo", memo); + } + + + /** + * @return memo 欸住 + */ + @JSONField(name="memo") + public java.lang.String getMemo() { + return getStr("memo"); + } + + /** + * name: isdefault + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param isdefault 默认收获地址,1 是设置为默认 + */ + @JSONField(name="isdefault") + public void setIsdefault(java.lang.Integer isdefault) { + set("isdefault", isdefault); + } + + + /** + * @return isdefault 默认收获地址,1 是设置为默认 + */ + @JSONField(name="isdefault") + public java.lang.Integer getIsdefault() { + return getInt("isdefault"); + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDeviceConfig.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDeviceConfig.java new file mode 100644 index 0000000..acc1ff7 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDeviceConfig.java @@ -0,0 +1,106 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Mon May 04 01:37:44 CST 2020 + * TableName: device_config + * Remarks: 出入控制 - 设备连接参数配置 + * PrimaryKey: supermarket_id + */ +@SuppressWarnings("serial") +public abstract class BaseDeviceConfig> extends BaseModel implements IBean { + + public static final String tablename = "device_config"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: content + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param content { + cameras: [ + { id: 'in', ip: '', port: 123 }, + { id: 'out', ip: '', port: 123 } + ], + + scales: [ + { id: 'in', ip: '', port: 123 }, + { id: 'out', ip: '', port: 123 } + ], + + leds: [ + { id: 'in', ip: '', port: 123 }, + { id: 'out', ip: '', port: 123 } + ] + + plcs: [ + { id: 'all', ip: '', port: 123 } + ] +} + */ + @JSONField(name="content") + public void setContent(String content) { + set("content", content); + } + + + /** + * @return content { + cameras: [ + { id: 'in', ip: '', port: 123 }, + { id: 'out', ip: '', port: 123 } + ], + + scales: [ + { id: 'in', ip: '', port: 123 }, + { id: 'out', ip: '', port: 123 } + ], + + leds: [ + { id: 'in', ip: '', port: 123 }, + { id: 'out', ip: '', port: 123 } + ] + + plcs: [ + { id: 'all', ip: '', port: 123 } + ] +} + */ + @JSONField(name="content") + public String getContent() { + return getStr("content"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDriver.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDriver.java new file mode 100644 index 0000000..c8cc8a4 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseDriver.java @@ -0,0 +1,156 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: driver + * Remarks: 基础配置 - 司机信息 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseDriver> extends BaseModel implements IBean { + + public static final String tablename = "driver"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 所属物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(java.lang.Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 所属物流公司 + */ + @JSONField(name="trans_co_id") + public java.lang.Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: name + * type: VARCHAR(8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name 司机姓名 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 司机姓名 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: phone + * type: CHAR(11) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param phone 司机电话 + */ + @JSONField(name="phone") + public void setPhone(java.lang.String phone) { + set("phone", phone); + } + + + /** + * @return phone 司机电话 + */ + @JSONField(name="phone") + public java.lang.String getPhone() { + return getStr("phone"); + } + + /** + * name: memo + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo + */ + @JSONField(name="memo") + public void setMemo(java.lang.String memo) { + set("memo", memo); + } + + + /** + * @return memo + */ + @JSONField(name="memo") + public java.lang.String getMemo() { + return getStr("memo"); + } + + /** + * name: del + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: 0 + * @param del 逻辑删除字段 + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del 逻辑删除字段 + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseModifyLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseModifyLog.java new file mode 100644 index 0000000..c886d77 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseModifyLog.java @@ -0,0 +1,244 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Mon Apr 27 23:46:49 CST 2020 + * TableName: modify_log + * Remarks: 日志相关 - 配置相关表修改日志记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseModifyLog> extends BaseModel implements IBean { + + public static final String tablename = "modify_log"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: BIGINT(19) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(Long id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public Long getId() { + return getLong("id"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId 创建用户id + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id 创建用户id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: table + * type: VARCHAR(50) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param table 修改的数据表名 + */ + @JSONField(name="table") + public void setTable(String table) { + set("table", table); + } + + + /** + * @return table 修改的数据表名 + */ + @JSONField(name="table") + public String getTable() { + return getStr("table"); + } + + /** + * name: pks + * type: VARCHAR(50) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param pks 主键数组,兼容复合主键 + */ + @JSONField(name="pks") + public void setPks(String pks) { + set("pks", pks); + } + + + /** + * @return pks 主键数组,兼容复合主键 + */ + @JSONField(name="pks") + public String getPks() { + return getStr("pks"); + } + + /** + * name: newdata + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param newdata 修改后的数据 + */ + @JSONField(name="newdata") + public void setNewdata(String newdata) { + set("newdata", newdata); + } + + + /** + * @return newdata 修改后的数据 + */ + @JSONField(name="newdata") + public String getNewdata() { + return getStr("newdata"); + } + + /** + * name: olddata + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param olddata 修改前的数据 + */ + @JSONField(name="olddata") + public void setOlddata(String olddata) { + set("olddata", olddata); + } + + + /** + * @return olddata 修改前的数据 + */ + @JSONField(name="olddata") + public String getOlddata() { + return getStr("olddata"); + } + + /** + * name: editdata + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param editdata 只记录修改的部分,包含主键 + */ + @JSONField(name="editdata") + public void setEditdata(String editdata) { + set("editdata", editdata); + } + + + /** + * @return editdata 只记录修改的部分,包含主键 + */ + @JSONField(name="editdata") + public String getEditdata() { + return getStr("editdata"); + } + + /** + * name: type + * type: SMALLINT(5) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param type 1.新增、2.修改、3.删除 + */ + @JSONField(name="type") + public void setType(Integer type) { + set("type", type); + } + + + /** + * @return type 1.新增、2.修改、3.删除 + */ + @JSONField(name="type") + public Integer getType() { + return getInt("type"); + } + + /** + * name: create_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param createTime 最后修改时间 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 最后修改时间 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderPurchase.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderPurchase.java new file mode 100644 index 0000000..ec15277 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderPurchase.java @@ -0,0 +1,676 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Wed Jul 01 11:46:36 CST 2020 + * TableName: order_purchase + * Remarks: 订单相关 - 从采购点购买 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public abstract class BaseOrderPurchase> extends BaseModel implements IBean { + + public static final String tablename = "order_purchase"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: sn + * type: CHAR(16) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public void setSn(String sn) { + set("sn", sn); + } + + + /** + * @return sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public String getSn() { + return getStr("sn"); + } + + /** + * name: uuid + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public void setUuid(String uuid) { + set("uuid", uuid); + } + + + /** + * @return uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public String getUuid() { + return getStr("uuid"); + } + + /** + * name: transport_id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transportId 出入场记录id + */ + @JSONField(name="transport_id") + public void setTransportId(String transportId) { + set("transport_id", transportId); + } + + + /** + * @return transport_id 出入场记录id + */ + @JSONField(name="transport_id") + public String getTransportId() { + return getStr("transport_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: purchase_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param purchaseId 砂场(采购点)id + */ + @JSONField(name="purchase_id") + public void setPurchaseId(Integer purchaseId) { + set("purchase_id", purchaseId); + } + + + /** + * @return purchase_id 砂场(采购点)id + */ + @JSONField(name="purchase_id") + public Integer getPurchaseId() { + return getInt("purchase_id"); + } + + /** + * name: weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param weight 运输重量 + */ + @JSONField(name="weight") + public void setWeight(java.math.BigDecimal weight) { + set("weight", weight); + } + + + /** + * @return weight 运输重量 + */ + @JSONField(name="weight") + public java.math.BigDecimal getWeight() { + return get("weight"); + } + + /** + * name: source_weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param sourceWeight 底单重量,从采购点出场的重量 + */ + @JSONField(name="source_weight") + public void setSourceWeight(java.math.BigDecimal sourceWeight) { + set("source_weight", sourceWeight); + } + + + /** + * @return source_weight 底单重量,从采购点出场的重量 + */ + @JSONField(name="source_weight") + public java.math.BigDecimal getSourceWeight() { + return get("source_weight"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司 + */ + @JSONField(name="trans_co_id") + public Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: trans_co_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoName + */ + @JSONField(name="trans_co_name") + public void setTransCoName(String transCoName) { + set("trans_co_name", transCoName); + } + + + /** + * @return trans_co_name + */ + @JSONField(name="trans_co_name") + public String getTransCoName() { + return getStr("trans_co_name"); + } + + /** + * name: trans_co_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerName 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public void setTransCoTexpayerName(String transCoTexpayerName) { + set("trans_co_texpayer_name", transCoTexpayerName); + } + + + /** + * @return trans_co_texpayer_name 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public String getTransCoTexpayerName() { + return getStr("trans_co_texpayer_name"); + } + + /** + * name: trans_co_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerNum + */ + @JSONField(name="trans_co_texpayer_num") + public void setTransCoTexpayerNum(String transCoTexpayerNum) { + set("trans_co_texpayer_num", transCoTexpayerNum); + } + + + /** + * @return trans_co_texpayer_num + */ + @JSONField(name="trans_co_texpayer_num") + public String getTransCoTexpayerNum() { + return getStr("trans_co_texpayer_num"); + } + + /** + * name: trans_co_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoAddress + */ + @JSONField(name="trans_co_address") + public void setTransCoAddress(String transCoAddress) { + set("trans_co_address", transCoAddress); + } + + + /** + * @return trans_co_address + */ + @JSONField(name="trans_co_address") + public String getTransCoAddress() { + return getStr("trans_co_address"); + } + + /** + * name: trans_co_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoPhone + */ + @JSONField(name="trans_co_phone") + public void setTransCoPhone(String transCoPhone) { + set("trans_co_phone", transCoPhone); + } + + + /** + * @return trans_co_phone + */ + @JSONField(name="trans_co_phone") + public String getTransCoPhone() { + return getStr("trans_co_phone"); + } + + /** + * name: trans_co_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankName + */ + @JSONField(name="trans_co_bank_name") + public void setTransCoBankName(String transCoBankName) { + set("trans_co_bank_name", transCoBankName); + } + + + /** + * @return trans_co_bank_name + */ + @JSONField(name="trans_co_bank_name") + public String getTransCoBankName() { + return getStr("trans_co_bank_name"); + } + + /** + * name: trans_co_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankAccount + */ + @JSONField(name="trans_co_bank_account") + public void setTransCoBankAccount(String transCoBankAccount) { + set("trans_co_bank_account", transCoBankAccount); + } + + + /** + * @return trans_co_bank_account + */ + @JSONField(name="trans_co_bank_account") + public String getTransCoBankAccount() { + return getStr("trans_co_bank_account"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: state + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: trans_distance + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transDistance 运距 + */ + @JSONField(name="trans_distance") + public void setTransDistance(java.math.BigDecimal transDistance) { + set("trans_distance", transDistance); + } + + + /** + * @return trans_distance 运距 + */ + @JSONField(name="trans_distance") + public java.math.BigDecimal getTransDistance() { + return get("trans_distance"); + } + + /** + * name: trans_price + * type: DECIMAL(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transPrice 运费 + */ + @JSONField(name="trans_price") + public void setTransPrice(java.math.BigDecimal transPrice) { + set("trans_price", transPrice); + } + + + /** + * @return trans_price 运费 + */ + @JSONField(name="trans_price") + public java.math.BigDecimal getTransPrice() { + return get("trans_price"); + } + + /** + * name: trans_unit_price + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transUnitPrice 运输单价 + */ + @JSONField(name="trans_unit_price") + public void setTransUnitPrice(java.math.BigDecimal transUnitPrice) { + set("trans_unit_price", transUnitPrice); + } + + + /** + * @return trans_unit_price 运输单价 + */ + @JSONField(name="trans_unit_price") + public java.math.BigDecimal getTransUnitPrice() { + return get("trans_unit_price"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createTime + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: settlement_user_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserId 结算用户id + */ + @JSONField(name="settlement_user_id") + public void setSettlementUserId(Integer settlementUserId) { + set("settlement_user_id", settlementUserId); + } + + + /** + * @return settlement_user_id 结算用户id + */ + @JSONField(name="settlement_user_id") + public Integer getSettlementUserId() { + return getInt("settlement_user_id"); + } + + /** + * name: settlement_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserName 结算用户名 + */ + @JSONField(name="settlement_user_name") + public void setSettlementUserName(String settlementUserName) { + set("settlement_user_name", settlementUserName); + } + + + /** + * @return settlement_user_name 结算用户名 + */ + @JSONField(name="settlement_user_name") + public String getSettlementUserName() { + return getStr("settlement_user_name"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: product_name + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param productName 品类名称 + */ + @JSONField(name="product_name") + public void setProductName(String productName) { + set("product_name", productName); + } + + + /** + * @return product_name 品类名称 + */ + @JSONField(name="product_name") + public String getProductName() { + return getStr("product_name"); + } + + /** + * name: old_sn + * type: CHAR(13) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param oldSn 兼容旧系统的数据 + */ + @JSONField(name="old_sn") + public void setOldSn(String oldSn) { + set("old_sn", oldSn); + } + + + /** + * @return old_sn 兼容旧系统的数据 + */ + @JSONField(name="old_sn") + public String getOldSn() { + return getStr("old_sn"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java new file mode 100644 index 0000000..2ac519b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSale.java @@ -0,0 +1,1158 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Sun May 17 21:43:18 CST 2020 + * TableName: order_sale + * Remarks: 订单相关 - 销售单 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public abstract class BaseOrderSale> extends BaseModel implements IBean { + + public static final String tablename = "order_sale"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: sn + * type: CHAR(16) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public void setSn(String sn) { + set("sn", sn); + } + + + /** + * @return sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public String getSn() { + return getStr("sn"); + } + + /** + * name: uuid + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param uuid UUID 唯一验证,避免重复提交 + */ + @JSONField(name="uuid") + public void setUuid(String uuid) { + set("uuid", uuid); + } + + + /** + * @return uuid UUID 唯一验证,避免重复提交 + */ + @JSONField(name="uuid") + public String getUuid() { + return getStr("uuid"); + } + + /** + * name: transport_id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transportId 出入场记录id + */ + @JSONField(name="transport_id") + public void setTransportId(String transportId) { + set("transport_id", transportId); + } + + + /** + * @return transport_id 出入场记录id + */ + @JSONField(name="transport_id") + public String getTransportId() { + return getStr("transport_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerId + */ + @JSONField(name="customer_id") + public void setCustomerId(Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id + */ + @JSONField(name="customer_id") + public Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: customer_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerName + */ + @JSONField(name="customer_name") + public void setCustomerName(String customerName) { + set("customer_name", customerName); + } + + + /** + * @return customer_name + */ + @JSONField(name="customer_name") + public String getCustomerName() { + return getStr("customer_name"); + } + + /** + * name: customer_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerTexpayerName 客户开票公司名称 + */ + @JSONField(name="customer_texpayer_name") + public void setCustomerTexpayerName(String customerTexpayerName) { + set("customer_texpayer_name", customerTexpayerName); + } + + + /** + * @return customer_texpayer_name 客户开票公司名称 + */ + @JSONField(name="customer_texpayer_name") + public String getCustomerTexpayerName() { + return getStr("customer_texpayer_name"); + } + + /** + * name: customer_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerTexpayerNum 客户纳税人识别号 + */ + @JSONField(name="customer_texpayer_num") + public void setCustomerTexpayerNum(String customerTexpayerNum) { + set("customer_texpayer_num", customerTexpayerNum); + } + + + /** + * @return customer_texpayer_num 客户纳税人识别号 + */ + @JSONField(name="customer_texpayer_num") + public String getCustomerTexpayerNum() { + return getStr("customer_texpayer_num"); + } + + /** + * name: customer_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerAddress + */ + @JSONField(name="customer_address") + public void setCustomerAddress(String customerAddress) { + set("customer_address", customerAddress); + } + + + /** + * @return customer_address + */ + @JSONField(name="customer_address") + public String getCustomerAddress() { + return getStr("customer_address"); + } + + /** + * name: customer_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerPhone + */ + @JSONField(name="customer_phone") + public void setCustomerPhone(String customerPhone) { + set("customer_phone", customerPhone); + } + + + /** + * @return customer_phone + */ + @JSONField(name="customer_phone") + public String getCustomerPhone() { + return getStr("customer_phone"); + } + + /** + * name: customer_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerBankName + */ + @JSONField(name="customer_bank_name") + public void setCustomerBankName(String customerBankName) { + set("customer_bank_name", customerBankName); + } + + + /** + * @return customer_bank_name + */ + @JSONField(name="customer_bank_name") + public String getCustomerBankName() { + return getStr("customer_bank_name"); + } + + /** + * name: customer_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerBankAccount + */ + @JSONField(name="customer_bank_account") + public void setCustomerBankAccount(String customerBankAccount) { + set("customer_bank_account", customerBankAccount); + } + + + /** + * @return customer_bank_account + */ + @JSONField(name="customer_bank_account") + public String getCustomerBankAccount() { + return getStr("customer_bank_account"); + } + + /** + * name: customer_receiver_name + * type: VARCHAR(8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverName 收货人 + */ + @JSONField(name="customer_receiver_name") + public void setCustomerReceiverName(String customerReceiverName) { + set("customer_receiver_name", customerReceiverName); + } + + + /** + * @return customer_receiver_name 收货人 + */ + @JSONField(name="customer_receiver_name") + public String getCustomerReceiverName() { + return getStr("customer_receiver_name"); + } + + /** + * name: customer_receiver_phone + * type: CHAR(11) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverPhone 收货人电话 + */ + @JSONField(name="customer_receiver_phone") + public void setCustomerReceiverPhone(String customerReceiverPhone) { + set("customer_receiver_phone", customerReceiverPhone); + } + + + /** + * @return customer_receiver_phone 收货人电话 + */ + @JSONField(name="customer_receiver_phone") + public String getCustomerReceiverPhone() { + return getStr("customer_receiver_phone"); + } + + /** + * name: customer_receiver_address + * type: VARCHAR(256) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverAddress 送货地址 + */ + @JSONField(name="customer_receiver_address") + public void setCustomerReceiverAddress(String customerReceiverAddress) { + set("customer_receiver_address", customerReceiverAddress); + } + + + /** + * @return customer_receiver_address 送货地址 + */ + @JSONField(name="customer_receiver_address") + public String getCustomerReceiverAddress() { + return getStr("customer_receiver_address"); + } + + /** + * name: customer_receiver_lgtd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverLgtd 收货地址经度 + */ + @JSONField(name="customer_receiver_lgtd") + public void setCustomerReceiverLgtd(java.math.BigDecimal customerReceiverLgtd) { + set("customer_receiver_lgtd", customerReceiverLgtd); + } + + + /** + * @return customer_receiver_lgtd 收货地址经度 + */ + @JSONField(name="customer_receiver_lgtd") + public java.math.BigDecimal getCustomerReceiverLgtd() { + return get("customer_receiver_lgtd"); + } + + /** + * name: customer_receiver_lttd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverLttd 收货地址纬度 + */ + @JSONField(name="customer_receiver_lttd") + public void setCustomerReceiverLttd(java.math.BigDecimal customerReceiverLttd) { + set("customer_receiver_lttd", customerReceiverLttd); + } + + + /** + * @return customer_receiver_lttd 收货地址纬度 + */ + @JSONField(name="customer_receiver_lttd") + public java.math.BigDecimal getCustomerReceiverLttd() { + return get("customer_receiver_lttd"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司 + */ + @JSONField(name="trans_co_id") + public Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: trans_co_name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transCoName + */ + @JSONField(name="trans_co_name") + public void setTransCoName(String transCoName) { + set("trans_co_name", transCoName); + } + + + /** + * @return trans_co_name + */ + @JSONField(name="trans_co_name") + public String getTransCoName() { + return getStr("trans_co_name"); + } + + /** + * name: trans_co_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerName 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public void setTransCoTexpayerName(String transCoTexpayerName) { + set("trans_co_texpayer_name", transCoTexpayerName); + } + + + /** + * @return trans_co_texpayer_name 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public String getTransCoTexpayerName() { + return getStr("trans_co_texpayer_name"); + } + + /** + * name: trans_co_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerNum + */ + @JSONField(name="trans_co_texpayer_num") + public void setTransCoTexpayerNum(String transCoTexpayerNum) { + set("trans_co_texpayer_num", transCoTexpayerNum); + } + + + /** + * @return trans_co_texpayer_num + */ + @JSONField(name="trans_co_texpayer_num") + public String getTransCoTexpayerNum() { + return getStr("trans_co_texpayer_num"); + } + + /** + * name: trans_co_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoAddress + */ + @JSONField(name="trans_co_address") + public void setTransCoAddress(String transCoAddress) { + set("trans_co_address", transCoAddress); + } + + + /** + * @return trans_co_address + */ + @JSONField(name="trans_co_address") + public String getTransCoAddress() { + return getStr("trans_co_address"); + } + + /** + * name: trans_co_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoPhone + */ + @JSONField(name="trans_co_phone") + public void setTransCoPhone(String transCoPhone) { + set("trans_co_phone", transCoPhone); + } + + + /** + * @return trans_co_phone + */ + @JSONField(name="trans_co_phone") + public String getTransCoPhone() { + return getStr("trans_co_phone"); + } + + /** + * name: trans_co_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankName + */ + @JSONField(name="trans_co_bank_name") + public void setTransCoBankName(String transCoBankName) { + set("trans_co_bank_name", transCoBankName); + } + + + /** + * @return trans_co_bank_name + */ + @JSONField(name="trans_co_bank_name") + public String getTransCoBankName() { + return getStr("trans_co_bank_name"); + } + + /** + * name: trans_co_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankAccount + */ + @JSONField(name="trans_co_bank_account") + public void setTransCoBankAccount(String transCoBankAccount) { + set("trans_co_bank_account", transCoBankAccount); + } + + + /** + * @return trans_co_bank_account + */ + @JSONField(name="trans_co_bank_account") + public String getTransCoBankAccount() { + return getStr("trans_co_bank_account"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: driver_name + * type: VARCHAR(8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param driverName 司机姓名 + */ + @JSONField(name="driver_name") + public void setDriverName(String driverName) { + set("driver_name", driverName); + } + + + /** + * @return driver_name 司机姓名 + */ + @JSONField(name="driver_name") + public String getDriverName() { + return getStr("driver_name"); + } + + /** + * name: driver_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param driverPhone 司机手机号 + */ + @JSONField(name="driver_phone") + public void setDriverPhone(String driverPhone) { + set("driver_phone", driverPhone); + } + + + /** + * @return driver_phone 司机手机号 + */ + @JSONField(name="driver_phone") + public String getDriverPhone() { + return getStr("driver_phone"); + } + + /** + * name: unit_price + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param unitPrice 单价 + */ + @JSONField(name="unit_price") + public void setUnitPrice(java.math.BigDecimal unitPrice) { + set("unit_price", unitPrice); + } + + + /** + * @return unit_price 单价 + */ + @JSONField(name="unit_price") + public java.math.BigDecimal getUnitPrice() { + return get("unit_price"); + } + + /** + * name: total_price + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param totalPrice 总价,应付金额 + */ + @JSONField(name="total_price") + public void setTotalPrice(java.math.BigDecimal totalPrice) { + set("total_price", totalPrice); + } + + + /** + * @return total_price 总价,应付金额 + */ + @JSONField(name="total_price") + public java.math.BigDecimal getTotalPrice() { + return get("total_price"); + } + + /** + * name: weight + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param weight 购买重量 + */ + @JSONField(name="weight") + public void setWeight(java.math.BigDecimal weight) { + set("weight", weight); + } + + + /** + * @return weight 购买重量 + */ + @JSONField(name="weight") + public java.math.BigDecimal getWeight() { + return get("weight"); + } + + /** + * name: paid + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param paid 实际支付金额 + */ + @JSONField(name="paid") + public void setPaid(java.math.BigDecimal paid) { + set("paid", paid); + } + + + /** + * @return paid 实际支付金额 + */ + @JSONField(name="paid") + public java.math.BigDecimal getPaid() { + return get("paid"); + } + + /** + * name: pick_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param pickTime 提货时间 + */ + @JSONField(name="pick_time") + public void setPickTime(java.util.Date pickTime) { + set("pick_time", pickTime); + } + + + /** + * @return pick_time 提货时间 + */ + @JSONField(name="pick_time") + public java.util.Date getPickTime() { + return get("pick_time"); + } + + /** + * name: trans_distance + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transDistance 运距 + */ + @JSONField(name="trans_distance") + public void setTransDistance(java.math.BigDecimal transDistance) { + set("trans_distance", transDistance); + } + + + /** + * @return trans_distance 运距 + */ + @JSONField(name="trans_distance") + public java.math.BigDecimal getTransDistance() { + return get("trans_distance"); + } + + /** + * name: trans_price + * type: DECIMAL(10,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transPrice 运费 + */ + @JSONField(name="trans_price") + public void setTransPrice(java.math.BigDecimal transPrice) { + set("trans_price", transPrice); + } + + + /** + * @return trans_price 运费 + */ + @JSONField(name="trans_price") + public java.math.BigDecimal getTransPrice() { + return get("trans_price"); + } + + /** + * name: trans_unit_price + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transUnitPrice 运输单价 + */ + @JSONField(name="trans_unit_price") + public void setTransUnitPrice(java.math.BigDecimal transUnitPrice) { + set("trans_unit_price", transUnitPrice); + } + + + /** + * @return trans_unit_price 运输单价 + */ + @JSONField(name="trans_unit_price") + public java.math.BigDecimal getTransUnitPrice() { + return get("trans_unit_price"); + } + + /** + * name: pay_type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param payType 支付方式: 1,现场支付; 2,在线支付 + */ + @JSONField(name="pay_type") + public void setPayType(Integer payType) { + set("pay_type", payType); + } + + + /** + * @return pay_type 支付方式: 1,现场支付; 2,在线支付 + */ + @JSONField(name="pay_type") + public Integer getPayType() { + return getInt("pay_type"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createTime + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId 创建用户id + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id 创建用户id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: settlement_user_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserId 结算用户id + */ + @JSONField(name="settlement_user_id") + public void setSettlementUserId(Integer settlementUserId) { + set("settlement_user_id", settlementUserId); + } + + + /** + * @return settlement_user_id 结算用户id + */ + @JSONField(name="settlement_user_id") + public Integer getSettlementUserId() { + return getInt("settlement_user_id"); + } + + /** + * name: settlement_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserName 结算用户名 + */ + @JSONField(name="settlement_user_name") + public void setSettlementUserName(String settlementUserName) { + set("settlement_user_name", settlementUserName); + } + + + /** + * @return settlement_user_name 结算用户名 + */ + @JSONField(name="settlement_user_name") + public String getSettlementUserName() { + return getStr("settlement_user_name"); + } + + /** + * name: state + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场(后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场(后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: req_receipt + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param reqReceipt 是否需要发票,0 默认不需要,1需要 + */ + @JSONField(name="req_receipt") + public void setReqReceipt(Integer reqReceipt) { + set("req_receipt", reqReceipt); + } + + + /** + * @return req_receipt 是否需要发票,0 默认不需要,1需要 + */ + @JSONField(name="req_receipt") + public Integer getReqReceipt() { + return getInt("req_receipt"); + } + + /** + * name: ordercluster_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param orderclusterId ordercluste id + */ + @JSONField(name="ordercluster_id") + public void setOrderclusterId(Integer orderclusterId) { + set("ordercluster_id", orderclusterId); + } + + + /** + * @return ordercluster_id ordercluste id + */ + @JSONField(name="ordercluster_id") + public Integer getOrderclusterId() { + return getInt("ordercluster_id"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: isprepaid + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param isprepaid 是否已预付,在结算时勾选 + */ + @JSONField(name="isprepaid") + public void setIsprepaid(Integer isprepaid) { + set("isprepaid", isprepaid); + } + + + /** + * @return isprepaid 是否已预付,在结算时勾选 + */ + @JSONField(name="isprepaid") + public Integer getIsprepaid() { + return getInt("isprepaid"); + } + + /** + * name: memo + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo 备注 + */ + @JSONField(name="memo") + public void setMemo(String memo) { + set("memo", memo); + } + + + /** + * @return memo 备注 + */ + @JSONField(name="memo") + public String getMemo() { + return getStr("memo"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: product_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param productName 品类名称 + */ + @JSONField(name="product_name") + public void setProductName(String productName) { + set("product_name", productName); + } + + + /** + * @return product_name 品类名称 + */ + @JSONField(name="product_name") + public String getProductName() { + return getStr("product_name"); + } + + /** + * name: prepay_customer_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param prepayCustomerId 预付费客户 prepay_customer 表的id + */ + @JSONField(name="prepay_customer_id") + public void setPrepayCustomerId(Integer prepayCustomerId) { + set("prepay_customer_id", prepayCustomerId); + } + + + /** + * @return prepay_customer_id 预付费客户 prepay_customer 表的id + */ + @JSONField(name="prepay_customer_id") + public Integer getPrepayCustomerId() { + return getInt("prepay_customer_id"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSeq.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSeq.java new file mode 100644 index 0000000..4b461db --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderSeq.java @@ -0,0 +1,112 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Tue Apr 28 16:04:25 CST 2020 + * TableName: order_seq + * Remarks: 订单相关 - 序列号 + * PrimaryKey: tm,supermarket_id,type + */ +@SuppressWarnings("serial") +public abstract class BaseOrderSeq> extends BaseModel implements IBean { + + public static final String tablename = "order_seq"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: tm + * type: DATE(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param tm 日期 + */ + @JSONField(name="tm") + public void setTm(java.util.Date tm) { + set("tm", tm); + } + + + /** + * @return tm 日期 + */ + @JSONField(name="tm") + public java.util.Date getTm() { + return get("tm"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: type + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param type 订单类型 + */ + @JSONField(name="type") + public void setType(Integer type) { + set("type", type); + } + + + /** + * @return type 订单类型 + */ + @JSONField(name="type") + public Integer getType() { + return getInt("type"); + } + + /** + * name: seq + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param seq 序列号 + */ + @JSONField(name="seq") + public void setSeq(Integer seq) { + set("seq", seq); + } + + + /** + * @return seq 序列号 + */ + @JSONField(name="seq") + public Integer getSeq() { + return getInt("seq"); + } + + +} 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 new file mode 100644 index 0000000..5149ff8 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTemp.java @@ -0,0 +1,1028 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Wed Jul 01 11:46:36 CST 2020 + * TableName: order_temp + * Remarks: 订单相关 - 外销单 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public abstract class BaseOrderTemp> extends BaseModel implements IBean { + + public static final String tablename = "order_temp"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: sn + * type: CHAR(16) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public void setSn(String sn) { + set("sn", sn); + } + + + /** + * @return sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public String getSn() { + return getStr("sn"); + } + + /** + * name: uuid + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public void setUuid(String uuid) { + set("uuid", uuid); + } + + + /** + * @return uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public String getUuid() { + return getStr("uuid"); + } + + /** + * name: transport_id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transportId 出入场记录id + */ + @JSONField(name="transport_id") + public void setTransportId(String transportId) { + set("transport_id", transportId); + } + + + /** + * @return transport_id 出入场记录id + */ + @JSONField(name="transport_id") + public String getTransportId() { + return getStr("transport_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param weight 购买重量 + */ + @JSONField(name="weight") + public void setWeight(java.math.BigDecimal weight) { + set("weight", weight); + } + + + /** + * @return weight 购买重量 + */ + @JSONField(name="weight") + public java.math.BigDecimal getWeight() { + return get("weight"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: state + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置)(扩展,已生成待支付订单) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置)(扩展,已生成待支付订单) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createTime 创建时间 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 创建时间 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId 创建用户id + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id 创建用户id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: settlement_user_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserId 结算用户id + */ + @JSONField(name="settlement_user_id") + public void setSettlementUserId(Integer settlementUserId) { + set("settlement_user_id", settlementUserId); + } + + + /** + * @return settlement_user_id 结算用户id + */ + @JSONField(name="settlement_user_id") + public Integer getSettlementUserId() { + return getInt("settlement_user_id"); + } + + /** + * name: settlement_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserName 结算用户名 + */ + @JSONField(name="settlement_user_name") + public void setSettlementUserName(String settlementUserName) { + set("settlement_user_name", settlementUserName); + } + + + /** + * @return settlement_user_name 结算用户名 + */ + @JSONField(name="settlement_user_name") + public String getSettlementUserName() { + return getStr("settlement_user_name"); + } + + /** + * name: unit_price + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param unitPrice 单价 + */ + @JSONField(name="unit_price") + public void setUnitPrice(java.math.BigDecimal unitPrice) { + set("unit_price", unitPrice); + } + + + /** + * @return unit_price 单价 + */ + @JSONField(name="unit_price") + public java.math.BigDecimal getUnitPrice() { + return get("unit_price"); + } + + /** + * name: total_price + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param totalPrice 总价,应付费 + */ + @JSONField(name="total_price") + public void setTotalPrice(java.math.BigDecimal totalPrice) { + set("total_price", totalPrice); + } + + + /** + * @return total_price 总价,应付费 + */ + @JSONField(name="total_price") + public java.math.BigDecimal getTotalPrice() { + return get("total_price"); + } + + /** + * name: paid + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param paid 实际支付金额 + */ + @JSONField(name="paid") + public void setPaid(java.math.BigDecimal paid) { + set("paid", paid); + } + + + /** + * @return paid 实际支付金额 + */ + @JSONField(name="paid") + public java.math.BigDecimal getPaid() { + return get("paid"); + } + + /** + * name: pay_type + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param payType 支付方式: 1,现场支付; 2,在线支付 + */ + @JSONField(name="pay_type") + public void setPayType(Integer payType) { + set("pay_type", payType); + } + + + /** + * @return pay_type 支付方式: 1,现场支付; 2,在线支付 + */ + @JSONField(name="pay_type") + public Integer getPayType() { + return getInt("pay_type"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: isprepaid + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param isprepaid 是否已预付,在结算时勾选 + */ + @JSONField(name="isprepaid") + public void setIsprepaid(Integer isprepaid) { + set("isprepaid", isprepaid); + } + + + /** + * @return isprepaid 是否已预付,在结算时勾选 + */ + @JSONField(name="isprepaid") + public Integer getIsprepaid() { + return getInt("isprepaid"); + } + + /** + * name: memo + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo 备注 + */ + @JSONField(name="memo") + public void setMemo(String memo) { + set("memo", memo); + } + + + /** + * @return memo 备注 + */ + @JSONField(name="memo") + public String getMemo() { + return getStr("memo"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerId + */ + @JSONField(name="customer_id") + public void setCustomerId(Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id + */ + @JSONField(name="customer_id") + public Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: customer_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerName + */ + @JSONField(name="customer_name") + public void setCustomerName(String customerName) { + set("customer_name", customerName); + } + + + /** + * @return customer_name + */ + @JSONField(name="customer_name") + public String getCustomerName() { + return getStr("customer_name"); + } + + /** + * name: customer_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerTexpayerName 客户开票公司名称 + */ + @JSONField(name="customer_texpayer_name") + public void setCustomerTexpayerName(String customerTexpayerName) { + set("customer_texpayer_name", customerTexpayerName); + } + + + /** + * @return customer_texpayer_name 客户开票公司名称 + */ + @JSONField(name="customer_texpayer_name") + public String getCustomerTexpayerName() { + return getStr("customer_texpayer_name"); + } + + /** + * name: customer_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerTexpayerNum 客户纳税人识别号 + */ + @JSONField(name="customer_texpayer_num") + public void setCustomerTexpayerNum(String customerTexpayerNum) { + set("customer_texpayer_num", customerTexpayerNum); + } + + + /** + * @return customer_texpayer_num 客户纳税人识别号 + */ + @JSONField(name="customer_texpayer_num") + public String getCustomerTexpayerNum() { + return getStr("customer_texpayer_num"); + } + + /** + * name: customer_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerAddress + */ + @JSONField(name="customer_address") + public void setCustomerAddress(String customerAddress) { + set("customer_address", customerAddress); + } + + + /** + * @return customer_address + */ + @JSONField(name="customer_address") + public String getCustomerAddress() { + return getStr("customer_address"); + } + + /** + * name: customer_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerPhone + */ + @JSONField(name="customer_phone") + public void setCustomerPhone(String customerPhone) { + set("customer_phone", customerPhone); + } + + + /** + * @return customer_phone + */ + @JSONField(name="customer_phone") + public String getCustomerPhone() { + return getStr("customer_phone"); + } + + /** + * name: customer_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerBankName + */ + @JSONField(name="customer_bank_name") + public void setCustomerBankName(String customerBankName) { + set("customer_bank_name", customerBankName); + } + + + /** + * @return customer_bank_name + */ + @JSONField(name="customer_bank_name") + public String getCustomerBankName() { + return getStr("customer_bank_name"); + } + + /** + * name: customer_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerBankAccount + */ + @JSONField(name="customer_bank_account") + public void setCustomerBankAccount(String customerBankAccount) { + set("customer_bank_account", customerBankAccount); + } + + + /** + * @return customer_bank_account + */ + @JSONField(name="customer_bank_account") + public String getCustomerBankAccount() { + return getStr("customer_bank_account"); + } + + /** + * name: customer_receiver_name + * type: VARCHAR(8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverName 收货人 + */ + @JSONField(name="customer_receiver_name") + public void setCustomerReceiverName(String customerReceiverName) { + set("customer_receiver_name", customerReceiverName); + } + + + /** + * @return customer_receiver_name 收货人 + */ + @JSONField(name="customer_receiver_name") + public String getCustomerReceiverName() { + return getStr("customer_receiver_name"); + } + + /** + * name: customer_receiver_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverPhone 收货人电话 + */ + @JSONField(name="customer_receiver_phone") + public void setCustomerReceiverPhone(String customerReceiverPhone) { + set("customer_receiver_phone", customerReceiverPhone); + } + + + /** + * @return customer_receiver_phone 收货人电话 + */ + @JSONField(name="customer_receiver_phone") + public String getCustomerReceiverPhone() { + return getStr("customer_receiver_phone"); + } + + /** + * name: customer_receiver_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverAddress 送货地址 + */ + @JSONField(name="customer_receiver_address") + public void setCustomerReceiverAddress(String customerReceiverAddress) { + set("customer_receiver_address", customerReceiverAddress); + } + + + /** + * @return customer_receiver_address 送货地址 + */ + @JSONField(name="customer_receiver_address") + public String getCustomerReceiverAddress() { + return getStr("customer_receiver_address"); + } + + /** + * name: customer_receiver_lgtd + * type: DECIMAL(12,8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverLgtd 收货地址经度 + */ + @JSONField(name="customer_receiver_lgtd") + public void setCustomerReceiverLgtd(java.math.BigDecimal customerReceiverLgtd) { + set("customer_receiver_lgtd", customerReceiverLgtd); + } + + + /** + * @return customer_receiver_lgtd 收货地址经度 + */ + @JSONField(name="customer_receiver_lgtd") + public java.math.BigDecimal getCustomerReceiverLgtd() { + return get("customer_receiver_lgtd"); + } + + /** + * name: customer_receiver_lttd + * type: DECIMAL(12,8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverLttd 收货地址纬度 + */ + @JSONField(name="customer_receiver_lttd") + public void setCustomerReceiverLttd(java.math.BigDecimal customerReceiverLttd) { + set("customer_receiver_lttd", customerReceiverLttd); + } + + + /** + * @return customer_receiver_lttd 收货地址纬度 + */ + @JSONField(name="customer_receiver_lttd") + public java.math.BigDecimal getCustomerReceiverLttd() { + return get("customer_receiver_lttd"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司 + */ + @JSONField(name="trans_co_id") + public Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: trans_co_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoName + */ + @JSONField(name="trans_co_name") + public void setTransCoName(String transCoName) { + set("trans_co_name", transCoName); + } + + + /** + * @return trans_co_name + */ + @JSONField(name="trans_co_name") + public String getTransCoName() { + return getStr("trans_co_name"); + } + + /** + * name: trans_co_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerName 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public void setTransCoTexpayerName(String transCoTexpayerName) { + set("trans_co_texpayer_name", transCoTexpayerName); + } + + + /** + * @return trans_co_texpayer_name 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public String getTransCoTexpayerName() { + return getStr("trans_co_texpayer_name"); + } + + /** + * name: trans_co_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerNum + */ + @JSONField(name="trans_co_texpayer_num") + public void setTransCoTexpayerNum(String transCoTexpayerNum) { + set("trans_co_texpayer_num", transCoTexpayerNum); + } + + + /** + * @return trans_co_texpayer_num + */ + @JSONField(name="trans_co_texpayer_num") + public String getTransCoTexpayerNum() { + return getStr("trans_co_texpayer_num"); + } + + /** + * name: trans_co_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoAddress + */ + @JSONField(name="trans_co_address") + public void setTransCoAddress(String transCoAddress) { + set("trans_co_address", transCoAddress); + } + + + /** + * @return trans_co_address + */ + @JSONField(name="trans_co_address") + public String getTransCoAddress() { + return getStr("trans_co_address"); + } + + /** + * name: trans_co_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoPhone + */ + @JSONField(name="trans_co_phone") + public void setTransCoPhone(String transCoPhone) { + set("trans_co_phone", transCoPhone); + } + + + /** + * @return trans_co_phone + */ + @JSONField(name="trans_co_phone") + public String getTransCoPhone() { + return getStr("trans_co_phone"); + } + + /** + * name: trans_co_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankName + */ + @JSONField(name="trans_co_bank_name") + public void setTransCoBankName(String transCoBankName) { + set("trans_co_bank_name", transCoBankName); + } + + + /** + * @return trans_co_bank_name + */ + @JSONField(name="trans_co_bank_name") + public String getTransCoBankName() { + return getStr("trans_co_bank_name"); + } + + /** + * name: trans_co_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankAccount + */ + @JSONField(name="trans_co_bank_account") + public void setTransCoBankAccount(String transCoBankAccount) { + set("trans_co_bank_account", transCoBankAccount); + } + + + /** + * @return trans_co_bank_account + */ + @JSONField(name="trans_co_bank_account") + public String getTransCoBankAccount() { + return getStr("trans_co_bank_account"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: product_name + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param productName 品类名称 + */ + @JSONField(name="product_name") + public void setProductName(String productName) { + set("product_name", productName); + } + + + /** + * @return product_name 品类名称 + */ + @JSONField(name="product_name") + public String getProductName() { + return getStr("product_name"); + } + + /** + * name: ordercluster_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param orderclusterId ordercluste id + */ + @JSONField(name="ordercluster_id") + public void setOrderclusterId(Integer orderclusterId) { + set("ordercluster_id", orderclusterId); + } + + + /** + * @return ordercluster_id ordercluste id + */ + @JSONField(name="ordercluster_id") + public Integer getOrderclusterId() { + return getInt("ordercluster_id"); + } + + /** + * name: prepay_customer_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param prepayCustomerId 预付费客户 prepay_customer 表的id + */ + @JSONField(name="prepay_customer_id") + public void setPrepayCustomerId(Integer prepayCustomerId) { + set("prepay_customer_id", prepayCustomerId); + } + + + /** + * @return prepay_customer_id 预付费客户 prepay_customer 表的id + */ + @JSONField(name="prepay_customer_id") + public Integer getPrepayCustomerId() { + return getInt("prepay_customer_id"); + } + + /** + * name: old_sn + * type: CHAR(13) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param oldSn 兼容旧系统的数据 + */ + @JSONField(name="old_sn") + public void setOldSn(String oldSn) { + set("old_sn", oldSn); + } + + + /** + * @return old_sn 兼容旧系统的数据 + */ + @JSONField(name="old_sn") + public String getOldSn() { + return getStr("old_sn"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java new file mode 100644 index 0000000..90f03e2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTransfer.java @@ -0,0 +1,654 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Wed Jun 24 15:33:03 CST 2020 + * TableName: order_transfer + * Remarks: 订单相关 - 转运单 + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public abstract class BaseOrderTransfer> extends BaseModel implements IBean { + + public static final String tablename = "order_transfer"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: sn + * type: CHAR(16) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public void setSn(String sn) { + set("sn", sn); + } + + + /** + * @return sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public String getSn() { + return getStr("sn"); + } + + /** + * name: uuid + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public void setUuid(String uuid) { + set("uuid", uuid); + } + + + /** + * @return uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public String getUuid() { + return getStr("uuid"); + } + + /** + * name: transport_id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transportId 出入场记录id + */ + @JSONField(name="transport_id") + public void setTransportId(String transportId) { + set("transport_id", transportId); + } + + + /** + * @return transport_id 出入场记录id + */ + @JSONField(name="transport_id") + public String getTransportId() { + return getStr("transport_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: sandfarm_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param sandfarmId 砂场id + */ + @JSONField(name="sandfarm_id") + public void setSandfarmId(Integer sandfarmId) { + set("sandfarm_id", sandfarmId); + } + + + /** + * @return sandfarm_id 砂场id + */ + @JSONField(name="sandfarm_id") + public Integer getSandfarmId() { + return getInt("sandfarm_id"); + } + + /** + * name: weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param weight 运输重量 + */ + @JSONField(name="weight") + public void setWeight(java.math.BigDecimal weight) { + set("weight", weight); + } + + + /** + * @return weight 运输重量 + */ + @JSONField(name="weight") + public java.math.BigDecimal getWeight() { + return get("weight"); + } + + /** + * name: source_weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param sourceWeight 底单重量,从采砂点出场的重量 + */ + @JSONField(name="source_weight") + public void setSourceWeight(java.math.BigDecimal sourceWeight) { + set("source_weight", sourceWeight); + } + + + /** + * @return source_weight 底单重量,从采砂点出场的重量 + */ + @JSONField(name="source_weight") + public java.math.BigDecimal getSourceWeight() { + return get("source_weight"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司 + */ + @JSONField(name="trans_co_id") + public Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: trans_co_name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transCoName + */ + @JSONField(name="trans_co_name") + public void setTransCoName(String transCoName) { + set("trans_co_name", transCoName); + } + + + /** + * @return trans_co_name + */ + @JSONField(name="trans_co_name") + public String getTransCoName() { + return getStr("trans_co_name"); + } + + /** + * name: trans_co_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerName 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public void setTransCoTexpayerName(String transCoTexpayerName) { + set("trans_co_texpayer_name", transCoTexpayerName); + } + + + /** + * @return trans_co_texpayer_name 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public String getTransCoTexpayerName() { + return getStr("trans_co_texpayer_name"); + } + + /** + * name: trans_co_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerNum + */ + @JSONField(name="trans_co_texpayer_num") + public void setTransCoTexpayerNum(String transCoTexpayerNum) { + set("trans_co_texpayer_num", transCoTexpayerNum); + } + + + /** + * @return trans_co_texpayer_num + */ + @JSONField(name="trans_co_texpayer_num") + public String getTransCoTexpayerNum() { + return getStr("trans_co_texpayer_num"); + } + + /** + * name: trans_co_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoAddress + */ + @JSONField(name="trans_co_address") + public void setTransCoAddress(String transCoAddress) { + set("trans_co_address", transCoAddress); + } + + + /** + * @return trans_co_address + */ + @JSONField(name="trans_co_address") + public String getTransCoAddress() { + return getStr("trans_co_address"); + } + + /** + * name: trans_co_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoPhone + */ + @JSONField(name="trans_co_phone") + public void setTransCoPhone(String transCoPhone) { + set("trans_co_phone", transCoPhone); + } + + + /** + * @return trans_co_phone + */ + @JSONField(name="trans_co_phone") + public String getTransCoPhone() { + return getStr("trans_co_phone"); + } + + /** + * name: trans_co_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankName + */ + @JSONField(name="trans_co_bank_name") + public void setTransCoBankName(String transCoBankName) { + set("trans_co_bank_name", transCoBankName); + } + + + /** + * @return trans_co_bank_name + */ + @JSONField(name="trans_co_bank_name") + public String getTransCoBankName() { + return getStr("trans_co_bank_name"); + } + + /** + * name: trans_co_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankAccount + */ + @JSONField(name="trans_co_bank_account") + public void setTransCoBankAccount(String transCoBankAccount) { + set("trans_co_bank_account", transCoBankAccount); + } + + + /** + * @return trans_co_bank_account + */ + @JSONField(name="trans_co_bank_account") + public String getTransCoBankAccount() { + return getStr("trans_co_bank_account"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: state + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: trans_distance + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transDistance 运距 + */ + @JSONField(name="trans_distance") + public void setTransDistance(java.math.BigDecimal transDistance) { + set("trans_distance", transDistance); + } + + + /** + * @return trans_distance 运距 + */ + @JSONField(name="trans_distance") + public java.math.BigDecimal getTransDistance() { + return get("trans_distance"); + } + + /** + * name: trans_price + * type: DECIMAL(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transPrice 运费 + */ + @JSONField(name="trans_price") + public void setTransPrice(java.math.BigDecimal transPrice) { + set("trans_price", transPrice); + } + + + /** + * @return trans_price 运费 + */ + @JSONField(name="trans_price") + public java.math.BigDecimal getTransPrice() { + return get("trans_price"); + } + + /** + * name: trans_unit_price + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transUnitPrice 运输单价 + */ + @JSONField(name="trans_unit_price") + public void setTransUnitPrice(java.math.BigDecimal transUnitPrice) { + set("trans_unit_price", transUnitPrice); + } + + + /** + * @return trans_unit_price 运输单价 + */ + @JSONField(name="trans_unit_price") + public java.math.BigDecimal getTransUnitPrice() { + return get("trans_unit_price"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createTime + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: settlement_user_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserId 结算用户id + */ + @JSONField(name="settlement_user_id") + public void setSettlementUserId(Integer settlementUserId) { + set("settlement_user_id", settlementUserId); + } + + + /** + * @return settlement_user_id 结算用户id + */ + @JSONField(name="settlement_user_id") + public Integer getSettlementUserId() { + return getInt("settlement_user_id"); + } + + /** + * name: settlement_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserName 结算用户名 + */ + @JSONField(name="settlement_user_name") + public void setSettlementUserName(String settlementUserName) { + set("settlement_user_name", settlementUserName); + } + + + /** + * @return settlement_user_name 结算用户名 + */ + @JSONField(name="settlement_user_name") + public String getSettlementUserName() { + return getStr("settlement_user_name"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: product_name + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param productName 品类名称 + */ + @JSONField(name="product_name") + public void setProductName(String productName) { + set("product_name", productName); + } + + + /** + * @return product_name 品类名称 + */ + @JSONField(name="product_name") + public String getProductName() { + return getStr("product_name"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTrash.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTrash.java new file mode 100644 index 0000000..86ea2f3 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrderTrash.java @@ -0,0 +1,611 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri May 01 22:23:27 CST 2020 + * TableName: order_trash + * Remarks: 订单相关 - 废料运出单 + + * PrimaryKey: sn + */ +@SuppressWarnings("serial") +public abstract class BaseOrderTrash> extends BaseModel implements IBean { + + public static final String tablename = "order_trash"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: sn + * type: CHAR(16) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public void setSn(String sn) { + set("sn", sn); + } + + + /** + * @return sn YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + */ + @JSONField(name="sn") + public String getSn() { + return getStr("sn"); + } + + /** + * name: uuid + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public void setUuid(String uuid) { + set("uuid", uuid); + } + + + /** + * @return uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public String getUuid() { + return getStr("uuid"); + } + + /** + * name: transport_id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transportId 出入场记录id + */ + @JSONField(name="transport_id") + public void setTransportId(String transportId) { + set("transport_id", transportId); + } + + + /** + * @return transport_id 出入场记录id + */ + @JSONField(name="transport_id") + public String getTransportId() { + return getStr("transport_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param weight 重量 + */ + @JSONField(name="weight") + public void setWeight(java.math.BigDecimal weight) { + set("weight", weight); + } + + + /** + * @return weight 重量 + */ + @JSONField(name="weight") + public java.math.BigDecimal getWeight() { + return get("weight"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: state + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场( +后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: trans_distance + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transDistance 运距 + */ + @JSONField(name="trans_distance") + public void setTransDistance(java.math.BigDecimal transDistance) { + set("trans_distance", transDistance); + } + + + /** + * @return trans_distance 运距 + */ + @JSONField(name="trans_distance") + public java.math.BigDecimal getTransDistance() { + return get("trans_distance"); + } + + /** + * name: trans_price + * type: DECIMAL(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transPrice 运费 + */ + @JSONField(name="trans_price") + public void setTransPrice(java.math.BigDecimal transPrice) { + set("trans_price", transPrice); + } + + + /** + * @return trans_price 运费 + */ + @JSONField(name="trans_price") + public java.math.BigDecimal getTransPrice() { + return get("trans_price"); + } + + /** + * name: trans_unit_price + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transUnitPrice 运输单价 + */ + @JSONField(name="trans_unit_price") + public void setTransUnitPrice(java.math.BigDecimal transUnitPrice) { + set("trans_unit_price", transUnitPrice); + } + + + /** + * @return trans_unit_price 运输单价 + */ + @JSONField(name="trans_unit_price") + public java.math.BigDecimal getTransUnitPrice() { + return get("trans_unit_price"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createTime + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: settlement_user_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserId 结算用户id + */ + @JSONField(name="settlement_user_id") + public void setSettlementUserId(Integer settlementUserId) { + set("settlement_user_id", settlementUserId); + } + + + /** + * @return settlement_user_id 结算用户id + */ + @JSONField(name="settlement_user_id") + public Integer getSettlementUserId() { + return getInt("settlement_user_id"); + } + + /** + * name: settlement_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param settlementUserName 结算用户名 + */ + @JSONField(name="settlement_user_name") + public void setSettlementUserName(String settlementUserName) { + set("settlement_user_name", settlementUserName); + } + + + /** + * @return settlement_user_name 结算用户名 + */ + @JSONField(name="settlement_user_name") + public String getSettlementUserName() { + return getStr("settlement_user_name"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: product_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param productName 品类名称 + */ + @JSONField(name="product_name") + public void setProductName(String productName) { + set("product_name", productName); + } + + + /** + * @return product_name 品类名称 + */ + @JSONField(name="product_name") + public String getProductName() { + return getStr("product_name"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司 + */ + @JSONField(name="trans_co_id") + public Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: trans_co_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoName + */ + @JSONField(name="trans_co_name") + public void setTransCoName(String transCoName) { + set("trans_co_name", transCoName); + } + + + /** + * @return trans_co_name + */ + @JSONField(name="trans_co_name") + public String getTransCoName() { + return getStr("trans_co_name"); + } + + /** + * name: trans_co_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerName 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public void setTransCoTexpayerName(String transCoTexpayerName) { + set("trans_co_texpayer_name", transCoTexpayerName); + } + + + /** + * @return trans_co_texpayer_name 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public String getTransCoTexpayerName() { + return getStr("trans_co_texpayer_name"); + } + + /** + * name: trans_co_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerNum + */ + @JSONField(name="trans_co_texpayer_num") + public void setTransCoTexpayerNum(String transCoTexpayerNum) { + set("trans_co_texpayer_num", transCoTexpayerNum); + } + + + /** + * @return trans_co_texpayer_num + */ + @JSONField(name="trans_co_texpayer_num") + public String getTransCoTexpayerNum() { + return getStr("trans_co_texpayer_num"); + } + + /** + * name: trans_co_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoAddress + */ + @JSONField(name="trans_co_address") + public void setTransCoAddress(String transCoAddress) { + set("trans_co_address", transCoAddress); + } + + + /** + * @return trans_co_address + */ + @JSONField(name="trans_co_address") + public String getTransCoAddress() { + return getStr("trans_co_address"); + } + + /** + * name: trans_co_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoPhone + */ + @JSONField(name="trans_co_phone") + public void setTransCoPhone(String transCoPhone) { + set("trans_co_phone", transCoPhone); + } + + + /** + * @return trans_co_phone + */ + @JSONField(name="trans_co_phone") + public String getTransCoPhone() { + return getStr("trans_co_phone"); + } + + /** + * name: trans_co_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankName + */ + @JSONField(name="trans_co_bank_name") + public void setTransCoBankName(String transCoBankName) { + set("trans_co_bank_name", transCoBankName); + } + + + /** + * @return trans_co_bank_name + */ + @JSONField(name="trans_co_bank_name") + public String getTransCoBankName() { + return getStr("trans_co_bank_name"); + } + + /** + * name: trans_co_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankAccount + */ + @JSONField(name="trans_co_bank_account") + public void setTransCoBankAccount(String transCoBankAccount) { + set("trans_co_bank_account", transCoBankAccount); + } + + + /** + * @return trans_co_bank_account + */ + @JSONField(name="trans_co_bank_account") + public String getTransCoBankAccount() { + return getStr("trans_co_bank_account"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java new file mode 100644 index 0000000..4102022 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseOrdercluster.java @@ -0,0 +1,882 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: ordercluster + * Remarks: 订单相关 - 订单 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseOrdercluster> extends BaseModel implements IBean { + + public static final String tablename = "ordercluster"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id 主键 + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id 主键 + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: uuid + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public void setUuid(java.lang.String uuid) { + set("uuid", uuid); + } + + + /** + * @return uuid UUID 唯一验证 + */ + @JSONField(name="uuid") + public java.lang.String getUuid() { + return getStr("uuid"); + } + + /** + * name: total_weight + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param totalWeight 总量 + */ + @JSONField(name="total_weight") + public void setTotalWeight(java.math.BigDecimal totalWeight) { + set("total_weight", totalWeight); + } + + + /** + * @return total_weight 总量 + */ + @JSONField(name="total_weight") + public java.math.BigDecimal getTotalWeight() { + return get("total_weight"); + } + + /** + * name: avg_weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param avgWeight 预估每车重量,根据这个生成订单。实际结算已净重为准 + */ + @JSONField(name="avg_weight") + public void setAvgWeight(java.math.BigDecimal avgWeight) { + set("avg_weight", avgWeight); + } + + + /** + * @return avg_weight 预估每车重量,根据这个生成订单。实际结算已净重为准 + */ + @JSONField(name="avg_weight") + public java.math.BigDecimal getAvgWeight() { + return get("avg_weight"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createTime 下单时间 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 下单时间 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: cutoff_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param cutoffTime 客户要求的送货截止时间 + */ + @JSONField(name="cutoff_time") + public void setCutoffTime(java.util.Date cutoffTime) { + set("cutoff_time", cutoffTime); + } + + + /** + * @return cutoff_time 客户要求的送货截止时间 + */ + @JSONField(name="cutoff_time") + public java.util.Date getCutoffTime() { + return get("cutoff_time"); + } + + /** + * name: complete_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param completeTime 实际完成时间 + */ + @JSONField(name="complete_time") + public void setCompleteTime(java.util.Date completeTime) { + set("complete_time", completeTime); + } + + + /** + * @return complete_time 实际完成时间 + */ + @JSONField(name="complete_time") + public java.util.Date getCompleteTime() { + return get("complete_time"); + } + + /** + * name: unit_price + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param unitPrice 单价 + */ + @JSONField(name="unit_price") + public void setUnitPrice(java.math.BigDecimal unitPrice) { + set("unit_price", unitPrice); + } + + + /** + * @return unit_price 单价 + */ + @JSONField(name="unit_price") + public java.math.BigDecimal getUnitPrice() { + return get("unit_price"); + } + + /** + * name: state + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param state 1.新建, 2.执行中 5.完成,9.取消 + */ + @JSONField(name="state") + public void setState(java.lang.Integer state) { + set("state", state); + } + + + /** + * @return state 1.新建, 2.执行中 5.完成,9.取消 + */ + @JSONField(name="state") + public java.lang.Integer getState() { + return getInt("state"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(java.lang.Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public java.lang.Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: trans_distance + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transDistance 运距 + */ + @JSONField(name="trans_distance") + public void setTransDistance(java.math.BigDecimal transDistance) { + set("trans_distance", transDistance); + } + + + /** + * @return trans_distance 运距 + */ + @JSONField(name="trans_distance") + public java.math.BigDecimal getTransDistance() { + return get("trans_distance"); + } + + /** + * name: pay_type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param payType 支付方式: 1,现场支付; 2,在线支付 + */ + @JSONField(name="pay_type") + public void setPayType(java.lang.Integer payType) { + set("pay_type", payType); + } + + + /** + * @return pay_type 支付方式: 1,现场支付; 2,在线支付 + */ + @JSONField(name="pay_type") + public java.lang.Integer getPayType() { + return getInt("pay_type"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId 创建该记录的用户id + */ + @JSONField(name="create_user_id") + public void setCreateUserId(java.lang.Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id 创建该记录的用户id + */ + @JSONField(name="create_user_id") + public java.lang.Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(java.lang.String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public java.lang.String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: req_receipt + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param reqReceipt 是否需要发票,0 默认不需要,1需要 + */ + @JSONField(name="req_receipt") + public void setReqReceipt(java.lang.Integer reqReceipt) { + set("req_receipt", reqReceipt); + } + + + /** + * @return req_receipt 是否需要发票,0 默认不需要,1需要 + */ + @JSONField(name="req_receipt") + public java.lang.Integer getReqReceipt() { + return getInt("req_receipt"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(java.lang.Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public java.lang.Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: product_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param productName 品类名称 + */ + @JSONField(name="product_name") + public void setProductName(java.lang.String productName) { + set("product_name", productName); + } + + + /** + * @return product_name 品类名称 + */ + @JSONField(name="product_name") + public java.lang.String getProductName() { + return getStr("product_name"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerId + */ + @JSONField(name="customer_id") + public void setCustomerId(java.lang.Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id + */ + @JSONField(name="customer_id") + public java.lang.Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: customer_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerName + */ + @JSONField(name="customer_name") + public void setCustomerName(java.lang.String customerName) { + set("customer_name", customerName); + } + + + /** + * @return customer_name + */ + @JSONField(name="customer_name") + public java.lang.String getCustomerName() { + return getStr("customer_name"); + } + + /** + * name: customer_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerTexpayerName 客户开票公司名称 + */ + @JSONField(name="customer_texpayer_name") + public void setCustomerTexpayerName(java.lang.String customerTexpayerName) { + set("customer_texpayer_name", customerTexpayerName); + } + + + /** + * @return customer_texpayer_name 客户开票公司名称 + */ + @JSONField(name="customer_texpayer_name") + public java.lang.String getCustomerTexpayerName() { + return getStr("customer_texpayer_name"); + } + + /** + * name: customer_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerTexpayerNum 客户纳税人识别号 + */ + @JSONField(name="customer_texpayer_num") + public void setCustomerTexpayerNum(java.lang.String customerTexpayerNum) { + set("customer_texpayer_num", customerTexpayerNum); + } + + + /** + * @return customer_texpayer_num 客户纳税人识别号 + */ + @JSONField(name="customer_texpayer_num") + public java.lang.String getCustomerTexpayerNum() { + return getStr("customer_texpayer_num"); + } + + /** + * name: customer_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerAddress + */ + @JSONField(name="customer_address") + public void setCustomerAddress(java.lang.String customerAddress) { + set("customer_address", customerAddress); + } + + + /** + * @return customer_address + */ + @JSONField(name="customer_address") + public java.lang.String getCustomerAddress() { + return getStr("customer_address"); + } + + /** + * name: customer_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerPhone + */ + @JSONField(name="customer_phone") + public void setCustomerPhone(java.lang.String customerPhone) { + set("customer_phone", customerPhone); + } + + + /** + * @return customer_phone + */ + @JSONField(name="customer_phone") + public java.lang.String getCustomerPhone() { + return getStr("customer_phone"); + } + + /** + * name: customer_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerBankName + */ + @JSONField(name="customer_bank_name") + public void setCustomerBankName(java.lang.String customerBankName) { + set("customer_bank_name", customerBankName); + } + + + /** + * @return customer_bank_name + */ + @JSONField(name="customer_bank_name") + public java.lang.String getCustomerBankName() { + return getStr("customer_bank_name"); + } + + /** + * name: customer_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerBankAccount + */ + @JSONField(name="customer_bank_account") + public void setCustomerBankAccount(java.lang.String customerBankAccount) { + set("customer_bank_account", customerBankAccount); + } + + + /** + * @return customer_bank_account + */ + @JSONField(name="customer_bank_account") + public java.lang.String getCustomerBankAccount() { + return getStr("customer_bank_account"); + } + + /** + * name: customer_receiver_name + * type: VARCHAR(8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverName 收货人 + */ + @JSONField(name="customer_receiver_name") + public void setCustomerReceiverName(java.lang.String customerReceiverName) { + set("customer_receiver_name", customerReceiverName); + } + + + /** + * @return customer_receiver_name 收货人 + */ + @JSONField(name="customer_receiver_name") + public java.lang.String getCustomerReceiverName() { + return getStr("customer_receiver_name"); + } + + /** + * name: customer_receiver_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverPhone 收货人电话 + */ + @JSONField(name="customer_receiver_phone") + public void setCustomerReceiverPhone(java.lang.String customerReceiverPhone) { + set("customer_receiver_phone", customerReceiverPhone); + } + + + /** + * @return customer_receiver_phone 收货人电话 + */ + @JSONField(name="customer_receiver_phone") + public java.lang.String getCustomerReceiverPhone() { + return getStr("customer_receiver_phone"); + } + + /** + * name: customer_receiver_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverAddress 送货地址 + */ + @JSONField(name="customer_receiver_address") + public void setCustomerReceiverAddress(java.lang.String customerReceiverAddress) { + set("customer_receiver_address", customerReceiverAddress); + } + + + /** + * @return customer_receiver_address 送货地址 + */ + @JSONField(name="customer_receiver_address") + public java.lang.String getCustomerReceiverAddress() { + return getStr("customer_receiver_address"); + } + + /** + * name: customer_receiver_lgtd + * type: DECIMAL(12,8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverLgtd 收货地址经度 + */ + @JSONField(name="customer_receiver_lgtd") + public void setCustomerReceiverLgtd(java.math.BigDecimal customerReceiverLgtd) { + set("customer_receiver_lgtd", customerReceiverLgtd); + } + + + /** + * @return customer_receiver_lgtd 收货地址经度 + */ + @JSONField(name="customer_receiver_lgtd") + public java.math.BigDecimal getCustomerReceiverLgtd() { + return get("customer_receiver_lgtd"); + } + + /** + * name: customer_receiver_lttd + * type: DECIMAL(12,8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param customerReceiverLttd 收货地址纬度 + */ + @JSONField(name="customer_receiver_lttd") + public void setCustomerReceiverLttd(java.math.BigDecimal customerReceiverLttd) { + set("customer_receiver_lttd", customerReceiverLttd); + } + + + /** + * @return customer_receiver_lttd 收货地址纬度 + */ + @JSONField(name="customer_receiver_lttd") + public java.math.BigDecimal getCustomerReceiverLttd() { + return get("customer_receiver_lttd"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(java.lang.Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司 + */ + @JSONField(name="trans_co_id") + public java.lang.Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: trans_co_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoName + */ + @JSONField(name="trans_co_name") + public void setTransCoName(java.lang.String transCoName) { + set("trans_co_name", transCoName); + } + + + /** + * @return trans_co_name + */ + @JSONField(name="trans_co_name") + public java.lang.String getTransCoName() { + return getStr("trans_co_name"); + } + + /** + * name: trans_co_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerName 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public void setTransCoTexpayerName(java.lang.String transCoTexpayerName) { + set("trans_co_texpayer_name", transCoTexpayerName); + } + + + /** + * @return trans_co_texpayer_name 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public java.lang.String getTransCoTexpayerName() { + return getStr("trans_co_texpayer_name"); + } + + /** + * name: trans_co_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerNum + */ + @JSONField(name="trans_co_texpayer_num") + public void setTransCoTexpayerNum(java.lang.String transCoTexpayerNum) { + set("trans_co_texpayer_num", transCoTexpayerNum); + } + + + /** + * @return trans_co_texpayer_num + */ + @JSONField(name="trans_co_texpayer_num") + public java.lang.String getTransCoTexpayerNum() { + return getStr("trans_co_texpayer_num"); + } + + /** + * name: trans_co_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoAddress + */ + @JSONField(name="trans_co_address") + public void setTransCoAddress(java.lang.String transCoAddress) { + set("trans_co_address", transCoAddress); + } + + + /** + * @return trans_co_address + */ + @JSONField(name="trans_co_address") + public java.lang.String getTransCoAddress() { + return getStr("trans_co_address"); + } + + /** + * name: trans_co_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoPhone + */ + @JSONField(name="trans_co_phone") + public void setTransCoPhone(java.lang.String transCoPhone) { + set("trans_co_phone", transCoPhone); + } + + + /** + * @return trans_co_phone + */ + @JSONField(name="trans_co_phone") + public java.lang.String getTransCoPhone() { + return getStr("trans_co_phone"); + } + + /** + * name: trans_co_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankName + */ + @JSONField(name="trans_co_bank_name") + public void setTransCoBankName(java.lang.String transCoBankName) { + set("trans_co_bank_name", transCoBankName); + } + + + /** + * @return trans_co_bank_name + */ + @JSONField(name="trans_co_bank_name") + public java.lang.String getTransCoBankName() { + return getStr("trans_co_bank_name"); + } + + /** + * name: trans_co_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankAccount + */ + @JSONField(name="trans_co_bank_account") + public void setTransCoBankAccount(java.lang.String transCoBankAccount) { + set("trans_co_bank_account", transCoBankAccount); + } + + + /** + * @return trans_co_bank_account + */ + @JSONField(name="trans_co_bank_account") + public java.lang.String getTransCoBankAccount() { + return getStr("trans_co_bank_account"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayCustomer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayCustomer.java new file mode 100644 index 0000000..bdd5310 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayCustomer.java @@ -0,0 +1,199 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Sun May 17 21:43:18 CST 2020 + * TableName: prepay_customer + * Remarks: 客户相关 - 预付费客户余额信息,每个客户在每个超市有单独的余额 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BasePrepayCustomer> extends BaseModel implements IBean { + + public static final String tablename = "prepay_customer"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public Integer getId() { + return getInt("id"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerId 客户表 customer 的 id + */ + @JSONField(name="customer_id") + public void setCustomerId(Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id 客户表 customer 的 id + */ + @JSONField(name="customer_id") + public Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: surplus + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0.00 + * @param surplus 账户余额 + */ + @JSONField(name="surplus") + public void setSurplus(java.math.BigDecimal surplus) { + set("surplus", surplus); + } + + + /** + * @return surplus 账户余额 + */ + @JSONField(name="surplus") + public java.math.BigDecimal getSurplus() { + return get("surplus"); + } + + /** + * name: recharge_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param rechargeTime 最后充值时间 + */ + @JSONField(name="recharge_time") + public void setRechargeTime(java.util.Date rechargeTime) { + set("recharge_time", rechargeTime); + } + + + /** + * @return recharge_time 最后充值时间 + */ + @JSONField(name="recharge_time") + public java.util.Date getRechargeTime() { + return get("recharge_time"); + } + + /** + * name: spend_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param spendTime 最后消费时间 + */ + @JSONField(name="spend_time") + public void setSpendTime(java.util.Date spendTime) { + set("spend_time", spendTime); + } + + + /** + * @return spend_time 最后消费时间 + */ + @JSONField(name="spend_time") + public java.util.Date getSpendTime() { + return get("spend_time"); + } + + /** + * name: first_recharge_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param firstRechargeTime 第一次充值时间 + */ + @JSONField(name="first_recharge_time") + public void setFirstRechargeTime(java.util.Date firstRechargeTime) { + set("first_recharge_time", firstRechargeTime); + } + + + /** + * @return first_recharge_time 第一次充值时间 + */ + @JSONField(name="first_recharge_time") + public java.util.Date getFirstRechargeTime() { + return get("first_recharge_time"); + } + + /** + * name: threshold + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: 3000.00 + * @param threshold 余额预警阈值 + */ + @JSONField(name="threshold") + public void setThreshold(java.math.BigDecimal threshold) { + set("threshold", threshold); + } + + + /** + * @return threshold 余额预警阈值 + */ + @JSONField(name="threshold") + public java.math.BigDecimal getThreshold() { + return get("threshold"); + } + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetail.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetail.java new file mode 100644 index 0000000..8298062 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetail.java @@ -0,0 +1,338 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Mon May 18 16:02:25 CST 2020 + * TableName: prepay_detail + * Remarks: 客户相关 - 客户预付费 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BasePrepayDetail> extends BaseModel implements IBean { + + public static final String tablename = "prepay_detail"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerId 客户id + */ + @JSONField(name="customer_id") + public void setCustomerId(Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id 客户id + */ + @JSONField(name="customer_id") + public Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: amount + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0.00 + * @param amount 充值金额 + */ + @JSONField(name="amount") + public void setAmount(java.math.BigDecimal amount) { + set("amount", amount); + } + + + /** + * @return amount 充值金额 + */ + @JSONField(name="amount") + public java.math.BigDecimal getAmount() { + return get("amount"); + } + + /** + * name: contact_name + * type: VARCHAR(100) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param contactName 联系人 + */ + @JSONField(name="contact_name") + public void setContactName(String contactName) { + set("contact_name", contactName); + } + + + /** + * @return contact_name 联系人 + */ + @JSONField(name="contact_name") + public String getContactName() { + return getStr("contact_name"); + } + + /** + * name: contact_phone + * type: VARCHAR(11) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param contactPhone 联系人电话 + */ + @JSONField(name="contact_phone") + public void setContactPhone(String contactPhone) { + set("contact_phone", contactPhone); + } + + + /** + * @return contact_phone 联系人电话 + */ + @JSONField(name="contact_phone") + public String getContactPhone() { + return getStr("contact_phone"); + } + + /** + * name: bank_name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param bankName 转账银行 + */ + @JSONField(name="bank_name") + public void setBankName(String bankName) { + set("bank_name", bankName); + } + + + /** + * @return bank_name 转账银行 + */ + @JSONField(name="bank_name") + public String getBankName() { + return getStr("bank_name"); + } + + /** + * name: bank_account + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param bankAccount 转账人(单位)银行账号 + */ + @JSONField(name="bank_account") + public void setBankAccount(String bankAccount) { + set("bank_account", bankAccount); + } + + + /** + * @return bank_account 转账人(单位)银行账号 + */ + @JSONField(name="bank_account") + public String getBankAccount() { + return getStr("bank_account"); + } + + /** + * name: serialnum + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param serialnum 转账付费银行流水号 + */ + @JSONField(name="serialnum") + public void setSerialnum(String serialnum) { + set("serialnum", serialnum); + } + + + /** + * @return serialnum 转账付费银行流水号 + */ + @JSONField(name="serialnum") + public String getSerialnum() { + return getStr("serialnum"); + } + + /** + * name: state + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 付费状态。 +1.提交、待审核,不计入余额 +2.审核通过,计入余额 +9.作废 + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 付费状态。 +1.提交、待审核,不计入余额 +2.审核通过,计入余额 +9.作废 + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param createTime 创建时间 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 创建时间 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: verify_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param verifyTime 审核时间,不论审核是否通过都更新 + */ + @JSONField(name="verify_time") + public void setVerifyTime(java.util.Date verifyTime) { + set("verify_time", verifyTime); + } + + + /** + * @return verify_time 审核时间,不论审核是否通过都更新 + */ + @JSONField(name="verify_time") + public java.util.Date getVerifyTime() { + return get("verify_time"); + } + + /** + * name: type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param type 1 正常充值,2 结算时补差额 + */ + @JSONField(name="type") + public void setType(Integer type) { + set("type", type); + } + + + /** + * @return type 1 正常充值,2 结算时补差额 + */ + @JSONField(name="type") + public Integer getType() { + return getInt("type"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetailStateHistory.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetailStateHistory.java new file mode 100644 index 0000000..8a096c7 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayDetailStateHistory.java @@ -0,0 +1,179 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Mon May 18 15:39:47 CST 2020 + * TableName: prepay_detail_state_history + * Remarks: 客户相关 - 客户预付费记录状态变化日志 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BasePrepayDetailStateHistory> extends BaseModel implements IBean { + + public static final String tablename = "prepay_detail_state_history"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: prepay_detail_id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param prepayDetailId prepay_detail id + */ + @JSONField(name="prepay_detail_id") + public void setPrepayDetailId(String prepayDetailId) { + set("prepay_detail_id", prepayDetailId); + } + + + /** + * @return prepay_detail_id prepay_detail id + */ + @JSONField(name="prepay_detail_id") + public String getPrepayDetailId() { + return getStr("prepay_detail_id"); + } + + /** + * name: state + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param state 变化后的状态值 + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 变化后的状态值 + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: change_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param changeTime 状态变化时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 状态变化时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: change_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param changeUserId 操作用户id + */ + @JSONField(name="change_user_id") + public void setChangeUserId(Integer changeUserId) { + set("change_user_id", changeUserId); + } + + + /** + * @return change_user_id 操作用户id + */ + @JSONField(name="change_user_id") + public Integer getChangeUserId() { + return getInt("change_user_id"); + } + + /** + * name: change_user_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param changeUserName 操作用户姓名 + */ + @JSONField(name="change_user_name") + public void setChangeUserName(String changeUserName) { + set("change_user_name", changeUserName); + } + + + /** + * @return change_user_name 操作用户姓名 + */ + @JSONField(name="change_user_name") + public String getChangeUserName() { + return getStr("change_user_name"); + } + + /** + * name: memo + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo 备注 + */ + @JSONField(name="memo") + public void setMemo(String memo) { + set("memo", memo); + } + + + /** + * @return memo 备注 + */ + @JSONField(name="memo") + public String getMemo() { + return getStr("memo"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayTruck.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayTruck.java new file mode 100644 index 0000000..bc1d102 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePrepayTruck.java @@ -0,0 +1,222 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Sun May 17 21:43:18 CST 2020 + * TableName: prepay_truck + * Remarks: 客户相关 - 预付费车辆 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BasePrepayTruck> extends BaseModel implements IBean { + + public static final String tablename = "prepay_truck"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public Integer getId() { + return getInt("id"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerId 客户表 customer 的 id + */ + @JSONField(name="customer_id") + public void setCustomerId(Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id 客户表 customer 的 id + */ + @JSONField(name="customer_id") + public Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司 + */ + @JSONField(name="trans_co_id") + public Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: valid_date + * type: DATE(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param validDate 有效日期 + */ + @JSONField(name="valid_date") + public void setValidDate(java.util.Date validDate) { + set("valid_date", validDate); + } + + + /** + * @return valid_date 有效日期 + */ + @JSONField(name="valid_date") + public java.util.Date getValidDate() { + return get("valid_date"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param type 1 配送车辆,算运费,3 外销车辆,不算运费,type 值和订单类型的type对应 + */ + @JSONField(name="type") + public void setType(Integer type) { + set("type", type); + } + + + /** + * @return type 1 配送车辆,算运费,3 外销车辆,不算运费,type 值和订单类型的type对应 + */ + @JSONField(name="type") + public Integer getType() { + return getInt("type"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseProduct.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseProduct.java new file mode 100644 index 0000000..0b3ad1e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseProduct.java @@ -0,0 +1,90 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: product + * Remarks: 基础配置 - 商品信息 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseProduct> extends BaseModel implements IBean { + + public static final String tablename = "product"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: name + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name 商品名称 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 商品名称 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del 逻辑删除标记 + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del 逻辑删除标记 + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePurchase.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePurchase.java new file mode 100644 index 0000000..250c9d6 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BasePurchase.java @@ -0,0 +1,244 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: purchase + * Remarks: 基础配置 - 采购点(采砂场) + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BasePurchase> extends BaseModel implements IBean { + + public static final String tablename = "purchase"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: name + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name 名称 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 名称 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: lgtd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lgtd + */ + @JSONField(name="lgtd") + public void setLgtd(java.math.BigDecimal lgtd) { + set("lgtd", lgtd); + } + + + /** + * @return lgtd + */ + @JSONField(name="lgtd") + public java.math.BigDecimal getLgtd() { + return get("lgtd"); + } + + /** + * name: lttd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lttd + */ + @JSONField(name="lttd") + public void setLttd(java.math.BigDecimal lttd) { + set("lttd", lttd); + } + + + /** + * @return lttd + */ + @JSONField(name="lttd") + public java.math.BigDecimal getLttd() { + return get("lttd"); + } + + /** + * name: address + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param address 地址 + */ + @JSONField(name="address") + public void setAddress(java.lang.String address) { + set("address", address); + } + + + /** + * @return address 地址 + */ + @JSONField(name="address") + public java.lang.String getAddress() { + return getStr("address"); + } + + /** + * name: contact_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param contactName 负责人姓名 + */ + @JSONField(name="contact_name") + public void setContactName(java.lang.String contactName) { + set("contact_name", contactName); + } + + + /** + * @return contact_name 负责人姓名 + */ + @JSONField(name="contact_name") + public java.lang.String getContactName() { + return getStr("contact_name"); + } + + /** + * name: contact_phone + * type: VARCHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param contactPhone 负责人手机号 + */ + @JSONField(name="contact_phone") + public void setContactPhone(java.lang.String contactPhone) { + set("contact_phone", contactPhone); + } + + + /** + * @return contact_phone 负责人手机号 + */ + @JSONField(name="contact_phone") + public java.lang.String getContactPhone() { + return getStr("contact_phone"); + } + + /** + * name: memo + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo + */ + @JSONField(name="memo") + public void setMemo(java.lang.String memo) { + set("memo", memo); + } + + + /** + * @return memo + */ + @JSONField(name="memo") + public java.lang.String getMemo() { + return getStr("memo"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del 逻辑删除标记 + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del 逻辑删除标记 + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + /** + * name: offset + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0.00 + * @param offset 因路况较差、在运费之外的基础上加上 净重 * 1 补贴,即最终运费: 运费单价 * 净重 + 净重 * 1 + */ + @JSONField(name="offset") + public void setOffset(java.math.BigDecimal offset) { + set("offset", offset); + } + + + /** + * @return offset 因路况较差、在运费之外的基础上加上 净重 * 1 补贴,即最终运费: 运费单价 * 净重 + 净重 * 1 + */ + @JSONField(name="offset") + public java.math.BigDecimal getOffset() { + return get("offset"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetail.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetail.java new file mode 100644 index 0000000..a3429bd --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetail.java @@ -0,0 +1,318 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Mon May 18 15:26:18 CST 2020 + * TableName: refund_detail + * Remarks: 客户相关 - 客户预付费退费记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseRefundDetail> extends BaseModel implements IBean { + + public static final String tablename = "refund_detail"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: customer_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param customerId 客户id + */ + @JSONField(name="customer_id") + public void setCustomerId(Integer customerId) { + set("customer_id", customerId); + } + + + /** + * @return customer_id 客户id + */ + @JSONField(name="customer_id") + public Integer getCustomerId() { + return getInt("customer_id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: amount + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0.00 + * @param amount 退费金额 + */ + @JSONField(name="amount") + public void setAmount(java.math.BigDecimal amount) { + set("amount", amount); + } + + + /** + * @return amount 退费金额 + */ + @JSONField(name="amount") + public java.math.BigDecimal getAmount() { + return get("amount"); + } + + /** + * name: contact_name + * type: VARCHAR(100) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param contactName 联系人 + */ + @JSONField(name="contact_name") + public void setContactName(String contactName) { + set("contact_name", contactName); + } + + + /** + * @return contact_name 联系人 + */ + @JSONField(name="contact_name") + public String getContactName() { + return getStr("contact_name"); + } + + /** + * name: contact_phone + * type: VARCHAR(11) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param contactPhone 联系人电话 + */ + @JSONField(name="contact_phone") + public void setContactPhone(String contactPhone) { + set("contact_phone", contactPhone); + } + + + /** + * @return contact_phone 联系人电话 + */ + @JSONField(name="contact_phone") + public String getContactPhone() { + return getStr("contact_phone"); + } + + /** + * name: bank_name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param bankName 转账银行 + */ + @JSONField(name="bank_name") + public void setBankName(String bankName) { + set("bank_name", bankName); + } + + + /** + * @return bank_name 转账银行 + */ + @JSONField(name="bank_name") + public String getBankName() { + return getStr("bank_name"); + } + + /** + * name: bank_account + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param bankAccount 转账人(单位)银行账号 + */ + @JSONField(name="bank_account") + public void setBankAccount(String bankAccount) { + set("bank_account", bankAccount); + } + + + /** + * @return bank_account 转账人(单位)银行账号 + */ + @JSONField(name="bank_account") + public String getBankAccount() { + return getStr("bank_account"); + } + + /** + * name: serialnum + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param serialnum 转账付费银行流水号 + */ + @JSONField(name="serialnum") + public void setSerialnum(String serialnum) { + set("serialnum", serialnum); + } + + + /** + * @return serialnum 转账付费银行流水号 + */ + @JSONField(name="serialnum") + public String getSerialnum() { + return getStr("serialnum"); + } + + /** + * name: state + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 付费状态。 +1.提交、待审核,不计入余额 +2.审核通过,不计入余额 +3.执行退费,计入余额 +9.作废 + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 付费状态。 +1.提交、待审核,不计入余额 +2.审核通过,不计入余额 +3.执行退费,计入余额 +9.作废 + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param createTime 创建时间 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 创建时间 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: verify_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param verifyTime 审核时间,不论审核是否通过都更新 + */ + @JSONField(name="verify_time") + public void setVerifyTime(java.util.Date verifyTime) { + set("verify_time", verifyTime); + } + + + /** + * @return verify_time 审核时间,不论审核是否通过都更新 + */ + @JSONField(name="verify_time") + public java.util.Date getVerifyTime() { + return get("verify_time"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetailStateHistory.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetailStateHistory.java new file mode 100644 index 0000000..758cbff --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseRefundDetailStateHistory.java @@ -0,0 +1,178 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Mon May 18 15:39:47 CST 2020 + * TableName: refund_detail_state_history + * Remarks: 客户相关 - 客户预付费退费记录状态变化日志 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseRefundDetailStateHistory> extends BaseModel implements IBean { + + public static final String tablename = "refund_detail_state_history"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: refund_detail_id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param refundDetailId refund_detail id + */ + @JSONField(name="refund_detail_id") + public void setRefundDetailId(String refundDetailId) { + set("refund_detail_id", refundDetailId); + } + + + /** + * @return refund_detail_id refund_detail id + */ + @JSONField(name="refund_detail_id") + public String getRefundDetailId() { + return getStr("refund_detail_id"); + } + + /** + * name: state + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param state 变化后的状态值 + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 变化后的状态值 + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: change_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param changeTime 状态变化时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 状态变化时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: change_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param changeUserId 操作用户id + */ + @JSONField(name="change_user_id") + public void setChangeUserId(Integer changeUserId) { + set("change_user_id", changeUserId); + } + + + /** + * @return change_user_id 操作用户id + */ + @JSONField(name="change_user_id") + public Integer getChangeUserId() { + return getInt("change_user_id"); + } + + /** + * name: change_user_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param changeUserName 操作用户姓名 + */ + @JSONField(name="change_user_name") + public void setChangeUserName(String changeUserName) { + set("change_user_name", changeUserName); + } + + + /** + * @return change_user_name 操作用户姓名 + */ + @JSONField(name="change_user_name") + public String getChangeUserName() { + return getStr("change_user_name"); + } + + /** + * name: memo + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo 备注 + */ + @JSONField(name="memo") + public void setMemo(String memo) { + set("memo", memo); + } + + + /** + * @return memo 备注 + */ + @JSONField(name="memo") + public String getMemo() { + return getStr("memo"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSandfarm.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSandfarm.java new file mode 100644 index 0000000..7af1b88 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSandfarm.java @@ -0,0 +1,244 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: sandfarm + * Remarks: 基础配置 - 生产点(采砂场) + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseSandfarm> extends BaseModel implements IBean { + + public static final String tablename = "sandfarm"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: name + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name 名称 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 名称 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: lgtd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lgtd + */ + @JSONField(name="lgtd") + public void setLgtd(java.math.BigDecimal lgtd) { + set("lgtd", lgtd); + } + + + /** + * @return lgtd + */ + @JSONField(name="lgtd") + public java.math.BigDecimal getLgtd() { + return get("lgtd"); + } + + /** + * name: lttd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lttd + */ + @JSONField(name="lttd") + public void setLttd(java.math.BigDecimal lttd) { + set("lttd", lttd); + } + + + /** + * @return lttd + */ + @JSONField(name="lttd") + public java.math.BigDecimal getLttd() { + return get("lttd"); + } + + /** + * name: address + * type: VARCHAR(255) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param address 地址 + */ + @JSONField(name="address") + public void setAddress(java.lang.String address) { + set("address", address); + } + + + /** + * @return address 地址 + */ + @JSONField(name="address") + public java.lang.String getAddress() { + return getStr("address"); + } + + /** + * name: contact_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param contactName 负责人姓名 + */ + @JSONField(name="contact_name") + public void setContactName(java.lang.String contactName) { + set("contact_name", contactName); + } + + + /** + * @return contact_name 负责人姓名 + */ + @JSONField(name="contact_name") + public java.lang.String getContactName() { + return getStr("contact_name"); + } + + /** + * name: contact_phone + * type: VARCHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param contactPhone 负责人手机号 + */ + @JSONField(name="contact_phone") + public void setContactPhone(java.lang.String contactPhone) { + set("contact_phone", contactPhone); + } + + + /** + * @return contact_phone 负责人手机号 + */ + @JSONField(name="contact_phone") + public java.lang.String getContactPhone() { + return getStr("contact_phone"); + } + + /** + * name: memo + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo + */ + @JSONField(name="memo") + public void setMemo(java.lang.String memo) { + set("memo", memo); + } + + + /** + * @return memo + */ + @JSONField(name="memo") + public java.lang.String getMemo() { + return getStr("memo"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del 逻辑删除标记 + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del 逻辑删除标记 + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + /** + * name: offset + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0.00 + * @param offset 因路况较差、在运费之外的基础上加上 净重 * 1 补贴,即最终运费: 运费单价 * 净重 + 净重 * 1 + */ + @JSONField(name="offset") + public void setOffset(java.math.BigDecimal offset) { + set("offset", offset); + } + + + /** + * @return offset 因路况较差、在运费之外的基础上加上 净重 * 1 补贴,即最终运费: 运费单价 * 净重 + 净重 * 1 + */ + @JSONField(name="offset") + public java.math.BigDecimal getOffset() { + return get("offset"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStock.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStock.java new file mode 100644 index 0000000..547c502 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStock.java @@ -0,0 +1,112 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Tue May 12 23:18:24 CST 2020 + * TableName: stock + * Remarks: 订单相关 - 销售点库存量 + * PrimaryKey: supermarket_id,product_id + */ +@SuppressWarnings("serial") +public abstract class BaseStock> extends BaseModel implements IBean { + + public static final String tablename = "stock"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: stock_weight + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param stockWeight 超市库存量 + */ + @JSONField(name="stock_weight") + public void setStockWeight(java.math.BigDecimal stockWeight) { + set("stock_weight", stockWeight); + } + + + /** + * @return stock_weight 超市库存量 + */ + @JSONField(name="stock_weight") + public java.math.BigDecimal getStockWeight() { + return get("stock_weight"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStockModifyLog.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStockModifyLog.java new file mode 100644 index 0000000..3912cf2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseStockModifyLog.java @@ -0,0 +1,200 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Tue May 12 23:18:24 CST 2020 + * TableName: stock_modify_log + * Remarks: 订单相关 - 手动修改库存记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseStockModifyLog> extends BaseModel implements IBean { + + public static final String tablename = "stock_modify_log"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public Integer getId() { + return getInt("id"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param productId 品类id + */ + @JSONField(name="product_id") + public void setProductId(Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 品类id + */ + @JSONField(name="product_id") + public Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: old_stock_weight + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param oldStockWeight 修改签该超市原有的库存量 + */ + @JSONField(name="old_stock_weight") + public void setOldStockWeight(java.math.BigDecimal oldStockWeight) { + set("old_stock_weight", oldStockWeight); + } + + + /** + * @return old_stock_weight 修改签该超市原有的库存量 + */ + @JSONField(name="old_stock_weight") + public java.math.BigDecimal getOldStockWeight() { + return get("old_stock_weight"); + } + + /** + * name: new_stock_weight + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param newStockWeight 修改后该超市的库存量 + */ + @JSONField(name="new_stock_weight") + public void setNewStockWeight(java.math.BigDecimal newStockWeight) { + set("new_stock_weight", newStockWeight); + } + + + /** + * @return new_stock_weight 修改后该超市的库存量 + */ + @JSONField(name="new_stock_weight") + public java.math.BigDecimal getNewStockWeight() { + return get("new_stock_weight"); + } + + /** + * name: create_user_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param createUserId 创建用户id + */ + @JSONField(name="create_user_id") + public void setCreateUserId(Integer createUserId) { + set("create_user_id", createUserId); + } + + + /** + * @return create_user_id 创建用户id + */ + @JSONField(name="create_user_id") + public Integer getCreateUserId() { + return getInt("create_user_id"); + } + + /** + * name: create_user_name + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param createUserName 创建用户名 + */ + @JSONField(name="create_user_name") + public void setCreateUserName(String createUserName) { + set("create_user_name", createUserName); + } + + + /** + * @return create_user_name 创建用户名 + */ + @JSONField(name="create_user_name") + public String getCreateUserName() { + return getStr("create_user_name"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarket.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarket.java new file mode 100644 index 0000000..b3836b4 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarket.java @@ -0,0 +1,224 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: supermarket + * Remarks: 基础配置 - 销售点(超市) + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseSupermarket> extends BaseModel implements IBean { + + public static final String tablename = "supermarket"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: name2 + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param name2 名称简写 + */ + @JSONField(name="name2") + public void setName2(java.lang.String name2) { + set("name2", name2); + } + + + /** + * @return name2 名称简写 + */ + @JSONField(name="name2") + public java.lang.String getName2() { + return getStr("name2"); + } + + /** + * name: lgtd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lgtd + */ + @JSONField(name="lgtd") + public void setLgtd(java.math.BigDecimal lgtd) { + set("lgtd", lgtd); + } + + + /** + * @return lgtd + */ + @JSONField(name="lgtd") + public java.math.BigDecimal getLgtd() { + return get("lgtd"); + } + + /** + * name: lttd + * type: DECIMAL(12,8) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param lttd + */ + @JSONField(name="lttd") + public void setLttd(java.math.BigDecimal lttd) { + set("lttd", lttd); + } + + + /** + * @return lttd + */ + @JSONField(name="lttd") + public java.math.BigDecimal getLttd() { + return get("lttd"); + } + + /** + * name: address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param address 地址 + */ + @JSONField(name="address") + public void setAddress(java.lang.String address) { + set("address", address); + } + + + /** + * @return address 地址 + */ + @JSONField(name="address") + public java.lang.String getAddress() { + return getStr("address"); + } + + /** + * name: phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param phone 电话 + */ + @JSONField(name="phone") + public void setPhone(java.lang.String phone) { + set("phone", phone); + } + + + /** + * @return phone 电话 + */ + @JSONField(name="phone") + public java.lang.String getPhone() { + return getStr("phone"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del 逻辑删除标志 + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del 逻辑删除标志 + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + /** + * name: isdeploy + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: 0 + * @param isdeploy 0.未部署,1.已部署 +本地程序以超市为单位部署,云端只对已部署的本地程序发送数据,并记录日志,可在本地程序重新上线后,补发数据 + */ + @JSONField(name="isdeploy") + public void setIsdeploy(java.lang.Integer isdeploy) { + set("isdeploy", isdeploy); + } + + + /** + * @return isdeploy 0.未部署,1.已部署 +本地程序以超市为单位部署,云端只对已部署的本地程序发送数据,并记录日志,可在本地程序重新上线后,补发数据 + */ + @JSONField(name="isdeploy") + public java.lang.Integer getIsdeploy() { + return getInt("isdeploy"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketProduct.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketProduct.java new file mode 100644 index 0000000..cd91cee --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketProduct.java @@ -0,0 +1,90 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: supermarket_product + * Remarks: 基础配置 - 超市关联 product 表 + * PrimaryKey: supermarket_id,product_id + */ +@SuppressWarnings("serial") +public abstract class BaseSupermarketProduct> extends BaseModel implements IBean { + + public static final String tablename = "supermarket_product"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(java.lang.Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public java.lang.Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: product_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param productId 商品id + */ + @JSONField(name="product_id") + public void setProductId(java.lang.Integer productId) { + set("product_id", productId); + } + + + /** + * @return product_id 商品id + */ + @JSONField(name="product_id") + public java.lang.Integer getProductId() { + return getInt("product_id"); + } + + /** + * name: unit_price + * type: DECIMAL(12,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param unitPrice 商品在超市的销售单价 + */ + @JSONField(name="unit_price") + public void setUnitPrice(java.math.BigDecimal unitPrice) { + set("unit_price", unitPrice); + } + + + /** + * @return unit_price 商品在超市的销售单价 + */ + @JSONField(name="unit_price") + public java.math.BigDecimal getUnitPrice() { + return get("unit_price"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketReceiverDistance.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketReceiverDistance.java new file mode 100644 index 0000000..80b0734 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketReceiverDistance.java @@ -0,0 +1,90 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: supermarket_receiver_distance + * Remarks: 基础配置 - 客户收获地址到每个超市的距离 + * PrimaryKey: supermarket_id,customer_receiver_id + */ +@SuppressWarnings("serial") +public abstract class BaseSupermarketReceiverDistance> extends BaseModel implements IBean { + + public static final String tablename = "supermarket_receiver_distance"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(java.lang.Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public java.lang.Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: customer_receiver_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param customerReceiverId 客户收获地址id + */ + @JSONField(name="customer_receiver_id") + public void setCustomerReceiverId(java.lang.Integer customerReceiverId) { + set("customer_receiver_id", customerReceiverId); + } + + + /** + * @return customer_receiver_id 客户收获地址id + */ + @JSONField(name="customer_receiver_id") + public java.lang.Integer getCustomerReceiverId() { + return getInt("customer_receiver_id"); + } + + /** + * name: distance + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param distance 运距 + */ + @JSONField(name="distance") + public void setDistance(java.math.BigDecimal distance) { + set("distance", distance); + } + + + /** + * @return distance 运距 + */ + @JSONField(name="distance") + public java.math.BigDecimal getDistance() { + return get("distance"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketSandfarmDistance.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketSandfarmDistance.java new file mode 100644 index 0000000..0cea08d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSupermarketSandfarmDistance.java @@ -0,0 +1,91 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: supermarket_sandfarm_distance + * Remarks: 基础配置 - 生产点到销售点的距离配置 + + * PrimaryKey: supermarket_id,sandfarm_id + */ +@SuppressWarnings("serial") +public abstract class BaseSupermarketSandfarmDistance> extends BaseModel implements IBean { + + public static final String tablename = "supermarket_sandfarm_distance"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(java.lang.Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public java.lang.Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: sandfarm_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param sandfarmId 砂场id + */ + @JSONField(name="sandfarm_id") + public void setSandfarmId(java.lang.Integer sandfarmId) { + set("sandfarm_id", sandfarmId); + } + + + /** + * @return sandfarm_id 砂场id + */ + @JSONField(name="sandfarm_id") + public java.lang.Integer getSandfarmId() { + return getInt("sandfarm_id"); + } + + /** + * name: distance + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param distance 运距 + */ + @JSONField(name="distance") + public void setDistance(java.math.BigDecimal distance) { + set("distance", distance); + } + + + /** + * @return distance 运距 + */ + @JSONField(name="distance") + public java.math.BigDecimal getDistance() { + return get("distance"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java new file mode 100644 index 0000000..6d3f964 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSyncTask.java @@ -0,0 +1,216 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Sun May 17 22:38:13 CST 2020 + * TableName: sync_task + * Remarks: 日志相关 - 数据同步 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseSyncTask> extends BaseModel implements IBean { + + public static final String tablename = "sync_task"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id 用uuid + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id 用uuid + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: state + * type: TINYINT UNSIGNED(3) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: 0 + * @param state 同步状态0,待同步,1已同步 + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 同步状态0,待同步,1已同步 + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: create_time + * type: DATETIME(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param createTime 创建时间,先创建,先推送 + */ + @JSONField(name="create_time") + public void setCreateTime(java.util.Date createTime) { + set("create_time", createTime); + } + + + /** + * @return create_time 创建时间,先创建,先推送 + */ + @JSONField(name="create_time") + public java.util.Date getCreateTime() { + return get("create_time"); + } + + /** + * name: save_data + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param saveData 需要新增的数据 +{ + tablename: [{数据体}] +} + */ + @JSONField(name="save_data") + public void setSaveData(String saveData) { + set("save_data", saveData); + } + + + /** + * @return save_data 需要新增的数据 +{ + tablename: [{数据体}] +} + */ + @JSONField(name="save_data") + public String getSaveData() { + return getStr("save_data"); + } + + /** + * name: update_data + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param updateData 需要修改的数据 +{ + tablename: [{数据体}] +} + */ + @JSONField(name="update_data") + public void setUpdateData(String updateData) { + set("update_data", updateData); + } + + + /** + * @return update_data 需要修改的数据 +{ + tablename: [{数据体}] +} + */ + @JSONField(name="update_data") + public String getUpdateData() { + return getStr("update_data"); + } + + /** + * name: delete_data + * type: JSON(1073741824) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param deleteData 需要删除的数据 +{ + tablename: [{数据体,主要是主键}] +} + */ + @JSONField(name="delete_data") + public void setDeleteData(String deleteData) { + set("delete_data", deleteData); + } + + + /** + * @return delete_data 需要删除的数据 +{ + tablename: [{数据体,主要是主键}] +} + */ + @JSONField(name="delete_data") + public String getDeleteData() { + return getStr("delete_data"); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSysuser.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSysuser.java new file mode 100644 index 0000000..6381f6f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseSysuser.java @@ -0,0 +1,238 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: sysuser + * Remarks: 用户管理 - 系统登陆账号 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseSysuser> extends BaseModel implements IBean { + + public static final String tablename = "sysuser"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: phone + * type: CHAR(11) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param phone 电话 + */ + @JSONField(name="phone") + public void setPhone(java.lang.String phone) { + set("phone", phone); + } + + + /** + * @return phone 电话 + */ + @JSONField(name="phone") + public java.lang.String getPhone() { + return getStr("phone"); + } + + /** + * name: name + * type: VARCHAR(20) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name 姓名 + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name 姓名 + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: password + * type: VARCHAR(64) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param password 密码 + */ + @JSONField(name="password") + public void setPassword(java.lang.String password) { + set("password", password); + } + + + /** + * @return password 密码 + */ + @JSONField(name="password") + public java.lang.String getPassword() { + return getStr("password"); + } + + /** + * name: type + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param type 1,超市用户 + 负责具体某个超市相关操作的用户需要关联某个超市 + 2,物流公司用户 + 需要关联物流公司 + 3,用户开放注册时的用户注册,可以审核关联客户表信息,否则就是个人用户不进行customer关联 + 修改操作不允许修改此字段 + 4. 司机 + 5. 楚和公司用户,可以查看管理全部超市情况 + */ + @JSONField(name="type") + public void setType(java.lang.Integer type) { + set("type", type); + } + + + /** + * @return type 1,超市用户 + 负责具体某个超市相关操作的用户需要关联某个超市 + 2,物流公司用户 + 需要关联物流公司 + 3,用户开放注册时的用户注册,可以审核关联客户表信息,否则就是个人用户不进行customer关联 + 修改操作不允许修改此字段 + 4. 司机 + 5. 楚和公司用户,可以查看管理全部超市情况 + */ + @JSONField(name="type") + public java.lang.Integer getType() { + return getInt("type"); + } + + /** + * name: entity_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param entityId 如果用户的相关操作关联了某个超市,物流公司,则填写 + */ + @JSONField(name="entity_id") + public void setEntityId(java.lang.Integer entityId) { + set("entity_id", entityId); + } + + + /** + * @return entity_id 如果用户的相关操作关联了某个超市,物流公司,则填写 + */ + @JSONField(name="entity_id") + public java.lang.Integer getEntityId() { + return getInt("entity_id"); + } + + /** + * name: role + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param role 100 超市管理员 +101 超市管理调度 +102 超市装卸货 + +201 物流管理人员 +202 司机 + +300 预留给注册用户 +400 占位 + +500 公司总经理,权限:查看、付费审核、退费审核 +501 公司财务人员,权限:查看、付费、退费 +502 公司领导,权限:查看 + */ + @JSONField(name="role") + public void setRole(java.lang.Integer role) { + set("role", role); + } + + + /** + * @return role 100 超市管理员 +101 超市管理调度 +102 超市装卸货 + +201 物流管理人员 +202 司机 + +300 预留给注册用户 +400 占位 + +500 公司总经理,权限:查看、付费审核、退费审核 +501 公司财务人员,权限:查看、付费、退费 +502 公司领导,权限:查看 + */ + @JSONField(name="role") + public java.lang.Integer getRole() { + return getInt("role"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del 逻辑删除标记位 + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del 逻辑删除标记位 + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigSale.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigSale.java new file mode 100644 index 0000000..edb5695 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigSale.java @@ -0,0 +1,135 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: trans_price_config_sale + * Remarks: 系统配置 - 销售运费配置信息 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseTransPriceConfigSale> extends BaseModel implements IBean { + + public static final String tablename = "trans_price_config_sale"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: min + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param min 价格分段起始吨数 + */ + @JSONField(name="min") + public void setMin(java.math.BigDecimal min) { + set("min", min); + } + + + /** + * @return min 价格分段起始吨数 + */ + @JSONField(name="min") + public java.math.BigDecimal getMin() { + return get("min"); + } + + /** + * name: max + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param max 价格分段截止吨数 + */ + @JSONField(name="max") + public void setMax(java.math.BigDecimal max) { + set("max", max); + } + + + /** + * @return max 价格分段截止吨数 + */ + @JSONField(name="max") + public java.math.BigDecimal getMax() { + return get("max"); + } + + /** + * name: start + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param start 价格分段对应起步价 + */ + @JSONField(name="start") + public void setStart(java.math.BigDecimal start) { + set("start", start); + } + + + /** + * @return start 价格分段对应起步价 + */ + @JSONField(name="start") + public java.math.BigDecimal getStart() { + return get("start"); + } + + /** + * name: unit_price + * type: DECIMAL UNSIGNED(10,3) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param unitPrice 每公里每吨运输单价 + */ + @JSONField(name="unit_price") + public void setUnitPrice(java.math.BigDecimal unitPrice) { + set("unit_price", unitPrice); + } + + + /** + * @return unit_price 每公里每吨运输单价 + */ + @JSONField(name="unit_price") + public java.math.BigDecimal getUnitPrice() { + return get("unit_price"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTransfer.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTransfer.java new file mode 100644 index 0000000..8f19242 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTransfer.java @@ -0,0 +1,135 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: trans_price_config_transfer + * Remarks: 系统配置 - 转运运费配置信息 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseTransPriceConfigTransfer> extends BaseModel implements IBean { + + public static final String tablename = "trans_price_config_transfer"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: min + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param min 价格分段起始吨数 + */ + @JSONField(name="min") + public void setMin(java.math.BigDecimal min) { + set("min", min); + } + + + /** + * @return min 价格分段起始吨数 + */ + @JSONField(name="min") + public java.math.BigDecimal getMin() { + return get("min"); + } + + /** + * name: max + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param max 价格分段截止吨数 + */ + @JSONField(name="max") + public void setMax(java.math.BigDecimal max) { + set("max", max); + } + + + /** + * @return max 价格分段截止吨数 + */ + @JSONField(name="max") + public java.math.BigDecimal getMax() { + return get("max"); + } + + /** + * name: start + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param start 价格分段对应起步价 + */ + @JSONField(name="start") + public void setStart(java.math.BigDecimal start) { + set("start", start); + } + + + /** + * @return start 价格分段对应起步价 + */ + @JSONField(name="start") + public java.math.BigDecimal getStart() { + return get("start"); + } + + /** + * name: unit_price + * type: DECIMAL UNSIGNED(10,3) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param unitPrice 每公里每吨运输单价 + */ + @JSONField(name="unit_price") + public void setUnitPrice(java.math.BigDecimal unitPrice) { + set("unit_price", unitPrice); + } + + + /** + * @return unit_price 每公里每吨运输单价 + */ + @JSONField(name="unit_price") + public java.math.BigDecimal getUnitPrice() { + return get("unit_price"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTrash.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTrash.java new file mode 100644 index 0000000..b9d126b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransPriceConfigTrash.java @@ -0,0 +1,135 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: trans_price_config_trash + * Remarks: 系统配置 - 废料运费配置信息 + + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseTransPriceConfigTrash> extends BaseModel implements IBean { + + public static final String tablename = "trans_price_config_trash"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: min + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param min 价格分段起始吨数 + */ + @JSONField(name="min") + public void setMin(java.math.BigDecimal min) { + set("min", min); + } + + + /** + * @return min 价格分段起始吨数 + */ + @JSONField(name="min") + public java.math.BigDecimal getMin() { + return get("min"); + } + + /** + * name: max + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param max 价格分段截止吨数 + */ + @JSONField(name="max") + public void setMax(java.math.BigDecimal max) { + set("max", max); + } + + + /** + * @return max 价格分段截止吨数 + */ + @JSONField(name="max") + public java.math.BigDecimal getMax() { + return get("max"); + } + + /** + * name: start + * type: DECIMAL UNSIGNED(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param start 价格分段对应起步价 + */ + @JSONField(name="start") + public void setStart(java.math.BigDecimal start) { + set("start", start); + } + + + /** + * @return start 价格分段对应起步价 + */ + @JSONField(name="start") + public java.math.BigDecimal getStart() { + return get("start"); + } + + /** + * name: unit_price + * type: DECIMAL UNSIGNED(10,3) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param unitPrice 每公里每吨运输单价 + */ + @JSONField(name="unit_price") + public void setUnitPrice(java.math.BigDecimal unitPrice) { + set("unit_price", unitPrice); + } + + + /** + * @return unit_price 每公里每吨运输单价 + */ + @JSONField(name="unit_price") + public java.math.BigDecimal getUnitPrice() { + return get("unit_price"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransport.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransport.java new file mode 100644 index 0000000..3477f7c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransport.java @@ -0,0 +1,718 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri May 01 22:23:27 CST 2020 + * TableName: transport + * Remarks: 订单相关 - 出入场记录 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseTransport> extends BaseModel implements IBean { + + public static final String tablename = "transport"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: CHAR(32) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id uuid,上传时,避免冲突 + */ + @JSONField(name="id") + public void setId(String id) { + set("id", id); + } + + + /** + * @return id uuid,上传时,避免冲突 + */ + @JSONField(name="id") + public String getId() { + return getStr("id"); + } + + /** + * name: order_sn + * type: CHAR(16) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param orderSn 关联订单号,方便查询 + */ + @JSONField(name="order_sn") + public void setOrderSn(String orderSn) { + set("order_sn", orderSn); + } + + + /** + * @return order_sn 关联订单号,方便查询 + */ + @JSONField(name="order_sn") + public String getOrderSn() { + return getStr("order_sn"); + } + + /** + * name: supermarket_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param supermarketId 超市id + */ + @JSONField(name="supermarket_id") + public void setSupermarketId(Integer supermarketId) { + set("supermarket_id", supermarketId); + } + + + /** + * @return supermarket_id 超市id + */ + @JSONField(name="supermarket_id") + public Integer getSupermarketId() { + return getInt("supermarket_id"); + } + + /** + * name: in_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param inTime 进场时间 + */ + @JSONField(name="in_time") + public void setInTime(java.util.Date inTime) { + set("in_time", inTime); + } + + + /** + * @return in_time 进场时间 + */ + @JSONField(name="in_time") + public java.util.Date getInTime() { + return get("in_time"); + } + + /** + * name: out_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param outTime 出场时间 + */ + @JSONField(name="out_time") + public void setOutTime(java.util.Date outTime) { + set("out_time", outTime); + } + + + /** + * @return out_time 出场时间 + */ + @JSONField(name="out_time") + public java.util.Date getOutTime() { + return get("out_time"); + } + + /** + * name: in_which + * type: VARCHAR(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param inWhich 入场地点 + */ + @JSONField(name="in_which") + public void setInWhich(String inWhich) { + set("in_which", inWhich); + } + + + /** + * @return in_which 入场地点 + */ + @JSONField(name="in_which") + public String getInWhich() { + return getStr("in_which"); + } + + /** + * name: out_which + * type: VARCHAR(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param outWhich 出场地点 + */ + @JSONField(name="out_which") + public void setOutWhich(String outWhich) { + set("out_which", outWhich); + } + + + /** + * @return out_which 出场地点 + */ + @JSONField(name="out_which") + public String getOutWhich() { + return getStr("out_which"); + } + + /** + * name: in_mode + * type: SMALLINT(5) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: 1 + * @param inMode 入场方式,1.系统自动,2.手动 + */ + @JSONField(name="in_mode") + public void setInMode(Integer inMode) { + set("in_mode", inMode); + } + + + /** + * @return in_mode 入场方式,1.系统自动,2.手动 + */ + @JSONField(name="in_mode") + public Integer getInMode() { + return getInt("in_mode"); + } + + /** + * name: out_mode + * type: SMALLINT(5) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param outMode 出场方式,1.系统自动,2.手动 + */ + @JSONField(name="out_mode") + public void setOutMode(Integer outMode) { + set("out_mode", outMode); + } + + + /** + * @return out_mode 出场方式,1.系统自动,2.手动 + */ + @JSONField(name="out_mode") + public Integer getOutMode() { + return getInt("out_mode"); + } + + /** + * name: first_weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param firstWeight 进场称重 + */ + @JSONField(name="first_weight") + public void setFirstWeight(java.math.BigDecimal firstWeight) { + set("first_weight", firstWeight); + } + + + /** + * @return first_weight 进场称重 + */ + @JSONField(name="first_weight") + public java.math.BigDecimal getFirstWeight() { + return get("first_weight"); + } + + /** + * name: second_weight + * type: DECIMAL(12,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param secondWeight 出场称重 + */ + @JSONField(name="second_weight") + public void setSecondWeight(java.math.BigDecimal secondWeight) { + set("second_weight", secondWeight); + } + + + /** + * @return second_weight 出场称重 + */ + @JSONField(name="second_weight") + public java.math.BigDecimal getSecondWeight() { + return get("second_weight"); + } + + /** + * name: first_weigh_mode + * type: SMALLINT(5) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param firstWeighMode 第一次称重方式,1.系统自动,2.手动 + */ + @JSONField(name="first_weigh_mode") + public void setFirstWeighMode(Integer firstWeighMode) { + set("first_weigh_mode", firstWeighMode); + } + + + /** + * @return first_weigh_mode 第一次称重方式,1.系统自动,2.手动 + */ + @JSONField(name="first_weigh_mode") + public Integer getFirstWeighMode() { + return getInt("first_weigh_mode"); + } + + /** + * name: second_weight_mode + * type: SMALLINT(5) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param secondWeightMode 第二次称重方式,1.系统自动,2.手动 + */ + @JSONField(name="second_weight_mode") + public void setSecondWeightMode(Integer secondWeightMode) { + set("second_weight_mode", secondWeightMode); + } + + + /** + * @return second_weight_mode 第二次称重方式,1.系统自动,2.手动 + */ + @JSONField(name="second_weight_mode") + public Integer getSecondWeightMode() { + return getInt("second_weight_mode"); + } + + /** + * name: first_pic + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param firstPic 入场车牌识别图片key + */ + @JSONField(name="first_pic") + public void setFirstPic(String firstPic) { + set("first_pic", firstPic); + } + + + /** + * @return first_pic 入场车牌识别图片key + */ + @JSONField(name="first_pic") + public String getFirstPic() { + return getStr("first_pic"); + } + + /** + * name: first_weight_which + * type: VARCHAR(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param firstWeightWhich 入场称重地点 + */ + @JSONField(name="first_weight_which") + public void setFirstWeightWhich(String firstWeightWhich) { + set("first_weight_which", firstWeightWhich); + } + + + /** + * @return first_weight_which 入场称重地点 + */ + @JSONField(name="first_weight_which") + public String getFirstWeightWhich() { + return getStr("first_weight_which"); + } + + /** + * name: second_weight_which + * type: VARCHAR(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param secondWeightWhich 出场称重地点 + */ + @JSONField(name="second_weight_which") + public void setSecondWeightWhich(String secondWeightWhich) { + set("second_weight_which", secondWeightWhich); + } + + + /** + * @return second_weight_which 出场称重地点 + */ + @JSONField(name="second_weight_which") + public String getSecondWeightWhich() { + return getStr("second_weight_which"); + } + + /** + * name: second_pic + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param secondPic 出场车牌识别图片key + */ + @JSONField(name="second_pic") + public void setSecondPic(String secondPic) { + set("second_pic", secondPic); + } + + + /** + * @return second_pic 出场车牌识别图片key + */ + @JSONField(name="second_pic") + public String getSecondPic() { + return getStr("second_pic"); + } + + /** + * name: arrive_time + * type: DATETIME(19) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param arriveTime 完成时间 + */ + @JSONField(name="arrive_time") + public void setArriveTime(java.util.Date arriveTime) { + set("arrive_time", arriveTime); + } + + + /** + * @return arrive_time 完成时间 + */ + @JSONField(name="arrive_time") + public java.util.Date getArriveTime() { + return get("arrive_time"); + } + + /** + * name: type + * type: SMALLINT(5) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param type 1、2、3、4、5 + */ + @JSONField(name="type") + public void setType(Integer type) { + set("type", type); + } + + + /** + * @return type 1、2、3、4、5 + */ + @JSONField(name="type") + public Integer getType() { + return getInt("type"); + } + + /** + * name: truck_license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param truckLicense 车牌号 + */ + @JSONField(name="truck_license") + public void setTruckLicense(String truckLicense) { + set("truck_license", truckLicense); + } + + + /** + * @return truck_license 车牌号 + */ + @JSONField(name="truck_license") + public String getTruckLicense() { + return getStr("truck_license"); + } + + /** + * name: memo + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo 备注 + */ + @JSONField(name="memo") + public void setMemo(String memo) { + set("memo", memo); + } + + + /** + * @return memo 备注 + */ + @JSONField(name="memo") + public String getMemo() { + return getStr("memo"); + } + + /** + * name: change_time + * type: TIMESTAMP(19) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: CURRENT_TIMESTAMP + * @param changeTime 最后修改时间 + */ + @JSONField(name="change_time") + public void setChangeTime(java.util.Date changeTime) { + set("change_time", changeTime); + } + + + /** + * @return change_time 最后修改时间 + */ + @JSONField(name="change_time") + public java.util.Date getChangeTime() { + return get("change_time"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoId 物流公司,物流公司信息存在这里,主要是方便查询,不用去关联订单,另外可以避免车辆跟换物流公司的问题 + */ + @JSONField(name="trans_co_id") + public void setTransCoId(Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id 物流公司,物流公司信息存在这里,主要是方便查询,不用去关联订单,另外可以避免车辆跟换物流公司的问题 + */ + @JSONField(name="trans_co_id") + public Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: trans_co_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoName + */ + @JSONField(name="trans_co_name") + public void setTransCoName(String transCoName) { + set("trans_co_name", transCoName); + } + + + /** + * @return trans_co_name + */ + @JSONField(name="trans_co_name") + public String getTransCoName() { + return getStr("trans_co_name"); + } + + /** + * name: trans_co_texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerName 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public void setTransCoTexpayerName(String transCoTexpayerName) { + set("trans_co_texpayer_name", transCoTexpayerName); + } + + + /** + * @return trans_co_texpayer_name 物流公司开票公司名称 + */ + @JSONField(name="trans_co_texpayer_name") + public String getTransCoTexpayerName() { + return getStr("trans_co_texpayer_name"); + } + + /** + * name: trans_co_texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoTexpayerNum + */ + @JSONField(name="trans_co_texpayer_num") + public void setTransCoTexpayerNum(String transCoTexpayerNum) { + set("trans_co_texpayer_num", transCoTexpayerNum); + } + + + /** + * @return trans_co_texpayer_num + */ + @JSONField(name="trans_co_texpayer_num") + public String getTransCoTexpayerNum() { + return getStr("trans_co_texpayer_num"); + } + + /** + * name: trans_co_address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoAddress + */ + @JSONField(name="trans_co_address") + public void setTransCoAddress(String transCoAddress) { + set("trans_co_address", transCoAddress); + } + + + /** + * @return trans_co_address + */ + @JSONField(name="trans_co_address") + public String getTransCoAddress() { + return getStr("trans_co_address"); + } + + /** + * name: trans_co_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoPhone + */ + @JSONField(name="trans_co_phone") + public void setTransCoPhone(String transCoPhone) { + set("trans_co_phone", transCoPhone); + } + + + /** + * @return trans_co_phone + */ + @JSONField(name="trans_co_phone") + public String getTransCoPhone() { + return getStr("trans_co_phone"); + } + + /** + * name: trans_co_bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankName + */ + @JSONField(name="trans_co_bank_name") + public void setTransCoBankName(String transCoBankName) { + set("trans_co_bank_name", transCoBankName); + } + + + /** + * @return trans_co_bank_name + */ + @JSONField(name="trans_co_bank_name") + public String getTransCoBankName() { + return getStr("trans_co_bank_name"); + } + + /** + * name: trans_co_bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param transCoBankAccount + */ + @JSONField(name="trans_co_bank_account") + public void setTransCoBankAccount(String transCoBankAccount) { + set("trans_co_bank_account", transCoBankAccount); + } + + + /** + * @return trans_co_bank_account + */ + @JSONField(name="trans_co_bank_account") + public String getTransCoBankAccount() { + return getStr("trans_co_bank_account"); + } + + /** + * name: state + * type: SMALLINT(5) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场(后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public void setState(Integer state) { + set("state", state); + } + + + /** + * @return state 1,初始状态; +2,已进场;(后台自动设置) +3,已装载 +4,已离场(后台自动设置) +5,已收货 +9,订单作废 + + */ + @JSONField(name="state") + public Integer getState() { + return getInt("state"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransportCompany.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransportCompany.java new file mode 100644 index 0000000..3b35257 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTransportCompany.java @@ -0,0 +1,310 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: transport_company + * Remarks: 基础配置 - 物流公司 + * PrimaryKey: id + */ +@SuppressWarnings("serial") +public abstract class BaseTransportCompany> extends BaseModel implements IBean { + + public static final String tablename = "transport_company"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param id + */ + @JSONField(name="id") + public void setId(java.lang.Integer id) { + set("id", id); + } + + + /** + * @return id + */ + @JSONField(name="id") + public java.lang.Integer getId() { + return getInt("id"); + } + + /** + * name: name + * type: VARCHAR(128) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param name + */ + @JSONField(name="name") + public void setName(java.lang.String name) { + set("name", name); + } + + + /** + * @return name + */ + @JSONField(name="name") + public java.lang.String getName() { + return getStr("name"); + } + + /** + * name: lgtd + * type: DECIMAL(12,8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param lgtd + */ + @JSONField(name="lgtd") + public void setLgtd(java.math.BigDecimal lgtd) { + set("lgtd", lgtd); + } + + + /** + * @return lgtd + */ + @JSONField(name="lgtd") + public java.math.BigDecimal getLgtd() { + return get("lgtd"); + } + + /** + * name: lttd + * type: DECIMAL(12,8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param lttd + */ + @JSONField(name="lttd") + public void setLttd(java.math.BigDecimal lttd) { + set("lttd", lttd); + } + + + /** + * @return lttd + */ + @JSONField(name="lttd") + public java.math.BigDecimal getLttd() { + return get("lttd"); + } + + /** + * name: address + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param address 开票地址 + */ + @JSONField(name="address") + public void setAddress(java.lang.String address) { + set("address", address); + } + + + /** + * @return address 开票地址 + */ + @JSONField(name="address") + public java.lang.String getAddress() { + return getStr("address"); + } + + /** + * name: phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param phone 开票电话 + */ + @JSONField(name="phone") + public void setPhone(java.lang.String phone) { + set("phone", phone); + } + + + /** + * @return phone 开票电话 + */ + @JSONField(name="phone") + public java.lang.String getPhone() { + return getStr("phone"); + } + + /** + * name: texpayer_name + * type: VARCHAR(255) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param texpayerName 开票公司名称 + */ + @JSONField(name="texpayer_name") + public void setTexpayerName(java.lang.String texpayerName) { + set("texpayer_name", texpayerName); + } + + + /** + * @return texpayer_name 开票公司名称 + */ + @JSONField(name="texpayer_name") + public java.lang.String getTexpayerName() { + return getStr("texpayer_name"); + } + + /** + * name: texpayer_num + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param texpayerNum 税号 + */ + @JSONField(name="texpayer_num") + public void setTexpayerNum(java.lang.String texpayerNum) { + set("texpayer_num", texpayerNum); + } + + + /** + * @return texpayer_num 税号 + */ + @JSONField(name="texpayer_num") + public java.lang.String getTexpayerNum() { + return getStr("texpayer_num"); + } + + /** + * name: bank_name + * type: VARCHAR(128) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param bankName 开户行 + */ + @JSONField(name="bank_name") + public void setBankName(java.lang.String bankName) { + set("bank_name", bankName); + } + + + /** + * @return bank_name 开户行 + */ + @JSONField(name="bank_name") + public java.lang.String getBankName() { + return getStr("bank_name"); + } + + /** + * name: bank_account + * type: VARCHAR(20) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param bankAccount 开户行账号 + */ + @JSONField(name="bank_account") + public void setBankAccount(java.lang.String bankAccount) { + set("bank_account", bankAccount); + } + + + /** + * @return bank_account 开户行账号 + */ + @JSONField(name="bank_account") + public java.lang.String getBankAccount() { + return getStr("bank_account"); + } + + /** + * name: memo + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo 备注 + */ + @JSONField(name="memo") + public void setMemo(java.lang.String memo) { + set("memo", memo); + } + + + /** + * @return memo 备注 + */ + @JSONField(name="memo") + public java.lang.String getMemo() { + return getStr("memo"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del 逻辑删除标志 + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del 逻辑删除标志 + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + /** + * name: price_modulus + * type: DECIMAL UNSIGNED(12,4) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 1.0000 + * @param priceModulus 价格折扣系数 + */ + @JSONField(name="price_modulus") + public void setPriceModulus(java.math.BigDecimal priceModulus) { + set("price_modulus", priceModulus); + } + + + /** + * @return price_modulus 价格折扣系数 + */ + @JSONField(name="price_modulus") + public java.math.BigDecimal getPriceModulus() { + return get("price_modulus"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTruck.java b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTruck.java new file mode 100644 index 0000000..fb8f01e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/model/base/BaseTruck.java @@ -0,0 +1,310 @@ +package com.cowr.model.base; + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR Fri Apr 17 16:59:35 CST 2020 + * TableName: truck + * Remarks: 基础配置 - 运输车辆信息 + * PrimaryKey: license + */ +@SuppressWarnings("serial") +public abstract class BaseTruck> extends BaseModel implements IBean { + + public static final String tablename = "truck"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + + /** + * name: license + * type: VARCHAR(10) + * isNullable: NO + * isPrimaryKey: YES + * defaultValue: + * @param license + */ + @JSONField(name="license") + public void setLicense(java.lang.String license) { + set("license", license); + } + + + /** + * @return license + */ + @JSONField(name="license") + public java.lang.String getLicense() { + return getStr("license"); + } + + /** + * name: trans_co_id + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param transCoId + */ + @JSONField(name="trans_co_id") + public void setTransCoId(java.lang.Integer transCoId) { + set("trans_co_id", transCoId); + } + + + /** + * @return trans_co_id + */ + @JSONField(name="trans_co_id") + public java.lang.Integer getTransCoId() { + return getInt("trans_co_id"); + } + + /** + * name: capacity + * type: DECIMAL(10,2) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: + * @param capacity 载重 + */ + @JSONField(name="capacity") + public void setCapacity(java.math.BigDecimal capacity) { + set("capacity", capacity); + } + + + /** + * @return capacity 载重 + */ + @JSONField(name="capacity") + public java.math.BigDecimal getCapacity() { + return get("capacity"); + } + + /** + * name: memo + * type: VARCHAR(256) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param memo + */ + @JSONField(name="memo") + public void setMemo(java.lang.String memo) { + set("memo", memo); + } + + + /** + * @return memo + */ + @JSONField(name="memo") + public java.lang.String getMemo() { + return getStr("memo"); + } + + /** + * name: state + * type: INT(10) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: 1 + * @param state 状态: 1,正常 2,黑名单 + */ + @JSONField(name="state") + public void setState(java.lang.Integer state) { + set("state", state); + } + + + /** + * @return state 状态: 1,正常 2,黑名单 + */ + @JSONField(name="state") + public java.lang.Integer getState() { + return getInt("state"); + } + + /** + * name: del + * type: INT(10) + * isNullable: NO + * isPrimaryKey: NO + * defaultValue: 0 + * @param del + */ + @JSONField(name="del") + public void setDel(java.lang.Integer del) { + set("del", del); + } + + + /** + * @return del + */ + @JSONField(name="del") + public java.lang.Integer getDel() { + return getInt("del"); + } + + /** + * name: tare + * type: DECIMAL(10,2) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param tare 皮重 + */ + @JSONField(name="tare") + public void setTare(java.math.BigDecimal tare) { + set("tare", tare); + } + + + /** + * @return tare 皮重 + */ + @JSONField(name="tare") + public java.math.BigDecimal getTare() { + return get("tare"); + } + + /** + * name: model + * type: VARCHAR(32) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param model 型号 + */ + @JSONField(name="model") + public void setModel(java.lang.String model) { + set("model", model); + } + + + /** + * @return model 型号 + */ + @JSONField(name="model") + public java.lang.String getModel() { + return getStr("model"); + } + + /** + * name: number + * type: VARCHAR(4) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param number 车辆编码,每个物流公司唯一 + */ + @JSONField(name="number") + public void setNumber(java.lang.String number) { + set("number", number); + } + + + /** + * @return number 车辆编码,每个物流公司唯一 + */ + @JSONField(name="number") + public java.lang.String getNumber() { + return getStr("number"); + } + + /** + * name: owner_name + * type: VARCHAR(8) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param ownerName 车主姓名 + */ + @JSONField(name="owner_name") + public void setOwnerName(java.lang.String ownerName) { + set("owner_name", ownerName); + } + + + /** + * @return owner_name 车主姓名 + */ + @JSONField(name="owner_name") + public java.lang.String getOwnerName() { + return getStr("owner_name"); + } + + /** + * name: owner_phone + * type: CHAR(11) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param ownerPhone 车主电话 + */ + @JSONField(name="owner_phone") + public void setOwnerPhone(java.lang.String ownerPhone) { + set("owner_phone", ownerPhone); + } + + + /** + * @return owner_phone 车主电话 + */ + @JSONField(name="owner_phone") + public java.lang.String getOwnerPhone() { + return getStr("owner_phone"); + } + + /** + * name: gps + * type: VARCHAR(32) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param gps GPS 设备号 + */ + @JSONField(name="gps") + public void setGps(java.lang.String gps) { + set("gps", gps); + } + + + /** + * @return gps GPS 设备号 + */ + @JSONField(name="gps") + public java.lang.String getGps() { + return getStr("gps"); + } + + /** + * name: sim + * type: VARCHAR(32) + * isNullable: YES + * isPrimaryKey: NO + * defaultValue: + * @param sim GPS 设备上安装的手机卡号 + */ + @JSONField(name="sim") + public void setSim(java.lang.String sim) { + set("sim", sim); + } + + + /** + * @return sim GPS 设备上安装的手机卡号 + */ + @JSONField(name="sim") + public java.lang.String getSim() { + return getStr("sim"); + } + + +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/CacheData.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/CacheData.java new file mode 100644 index 0000000..1916219 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/CacheData.java @@ -0,0 +1,23 @@ +package com.cowr.ssjygl; + +import com.cowr.ssjygl.transprice.TransPriceModel; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +public class CacheData { + // 配置文件获取 + public static String print_vendor = ""; + public static String print_vendorTaxId = ""; + public static Double start_trans_distance = 5.0; + public static Double weight_distinguish = null; + + // 需要通过数据库加载的参数 + public static Map TRANS_CO_PRICE_MODULUS; // 物流公司运输起步价格系数 + public static List TRANS_PRICE_CONFIG_TRASH; + public static List TRANS_PRICE_CONFIG_SALE; + public static List TRANS_PRICE_CONFIG_TRANSFER; + + public static boolean service_enable = false; +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicensePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicensePKValidator.java new file mode 100644 index 0000000..5f9f2e7 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicensePKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.authlicense; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.AuthLicense; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Jun 21 00:41:08 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +public class AuthLicensePKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("truck_license", "truck_license", "truck_license 必填"); + validateString("truck_license", 1, 10, "truck_license", "truck_license 长度 1~10"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseService.java new file mode 100644 index 0000000..03ef9c4 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseService.java @@ -0,0 +1,71 @@ +package com.cowr.ssjygl.authlicense; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.AuthLicense; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri May 01 23:24:53 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +public class AuthLicenseService extends BaseService { + public static final AuthLicenseService me = new AuthLicenseService(); + + public Page find(PageParam pp, String truck_license, String stm, String etm) { + String selectsql = "select * "; + String fromsql = "from auth_license t where 1=1 "; + List paraList = new ArrayList<>(); + + if(StrKit.notBlank(truck_license)){ + fromsql += " and truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if(StrKit.notBlank(stm)){ + fromsql += " and create_time >= ? \n"; + paraList.add(stm); + } + + if(StrKit.notBlank(etm)){ + fromsql += " and create_time <= ? \n"; + paraList.add(etm); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && AuthLicense.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + }else{ + findSql += " order by t.create_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + /** + * 判断车牌是否是系统中授权可用的 + * @param truck_license + * @return 已授权,返回 true, 未授权,返回 false + */ + public boolean isAuthLicense(String truck_license){ + return AuthLicense.dao.findById(truck_license) != null; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseValidator.java new file mode 100644 index 0000000..0966b90 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/authlicense/AuthLicenseValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.authlicense; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.AuthLicense; + +/** + * Generated by COWR Sun Jun 21 00:41:08 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +public class AuthLicenseValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("truck_license", "truck_license", "truck_license 必填"); + validateString("truck_license", 1, 10, "truck_license", "truck_license 长度 1~10"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistPKValidator.java new file mode 100644 index 0000000..c42fe51 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.blacklist; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Blacklist; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Thu Apr 16 22:55:34 CST 2020 + * TableName: blacklist + * Remarks: 基础配置 - 车辆黑名单 + * PrimaryKey: id + */ +public class BlacklistPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateString("id", 1, 32, "id", "id 长度 1~32"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java new file mode 100644 index 0000000..be70642 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistService.java @@ -0,0 +1,74 @@ +package com.cowr.ssjygl.blacklist; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Blacklist; +import com.cowr.model.Truck; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: blacklist + * Remarks: 基础配置 - 车辆黑名单 + * PrimaryKey: id + */ +public class BlacklistService extends BaseService { + public static final BlacklistService me = new BlacklistService(); + + public Page find(PageParam pp, String truck_license) { + String selectsql = "select t.*, co.name trans_co_name "; + String fromsql = "from blacklist t \n" + + " left join truck c on c.license = t.truck_license \n" + + " left join transport_company co on co.id = c.trans_co_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if(StrKit.notBlank(truck_license)){ + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Blacklist.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return Blacklist.dao.find("select * from blacklist"); + } + + /** + * 使用完整的车牌查询 + * 车辆被加入黑名单,并且没有移出黑名单 + * @param license + * @return + */ + public Blacklist truckInBlacklist(String license){ + if(StrKit.isBlank(license)){ + return null; + } + + return Blacklist.dao.findFirst("select * from blacklist \n" + + " where remove_user_id is null \n" + + " and truck_license = ? \n" + + " limit 0,1 ", license); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistValidator.java new file mode 100644 index 0000000..bb8531b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/blacklist/BlacklistValidator.java @@ -0,0 +1,43 @@ +package com.cowr.ssjygl.blacklist; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Blacklist; + +/** + * Generated by COWR Thu Apr 16 22:55:34 CST 2020 + * TableName: blacklist + * Remarks: 基础配置 - 车辆黑名单 + * PrimaryKey: id + */ +public class BlacklistValidator 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("truck_license", 1, 10, "truck_license", "truck_license 长度 1~10"); + validateString("driver_name", 0, 8, "driver_name", "driver_name 长度 0~8"); + validateString("driver_phone", 0, 11, "driver_phone", "driver_phone 长度 0~11"); + validateString("order_sn", 0, 16, "order_sn", "order_sn 长度 0~16"); + + validateInteger("reason_type", 1, 2147483647, "reason_type", "reason_type 范围 1~2147483647"); + validateString("reason_detail", 0, 255, "reason_detail", "reason_detail 长度 0~255"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Blacklist.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvController.java new file mode 100644 index 0000000..c0f94dd --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvController.java @@ -0,0 +1,21 @@ +package com.cowr.ssjygl.cctv; + +import com.cowr.common.utils.ReqUtil; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Cctv; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; +import com.jfinal.kit.HttpKit; + +/** + * Generated by COWR Fri Apr 17 16:59:38 CST 2020 + * TableName: cctv + * Remarks: 视频监控(硬盘录像机)信息 + * PrimaryKey: unit_id,unit_type + */ +public class CctvController extends Controller { + public void get(){ + renderJson(CctvService.me.get()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvService.java new file mode 100644 index 0000000..cbd0140 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/cctv/CctvService.java @@ -0,0 +1,47 @@ +package com.cowr.ssjygl.cctv; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Cctv; +import com.cowr.model.CctvChannels; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: cctv + * Remarks: 视频监控(硬盘录像机)信息 + * PrimaryKey: unit_id,unit_type + */ +public class CctvService extends BaseService { + public static final CctvService me = new CctvService(); + + public Result get(){ + List supCctv = Db.find("select t.* from cctv t"); + + if(supCctv == null || supCctv.isEmpty()){ + return Result.failed("未找到超市配置信息"); + } + + List list = CctvChannels.dao.find("select id, name, default_select, unit_id from cctv_channels"); + + for(Record out : supCctv){ + List outlist = new ArrayList<>(); + for(CctvChannels ch : list){ + if(ch.getUnitId().equals(out.getStr("unit_id"))){ + outlist.add(ch); + } + } + + out.set("channels", outlist); + } + + return Result.success(supCctv); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerPKValidator.java new file mode 100644 index 0000000..82a1214 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.customer; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Customer; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: customer + * Remarks: 客户 + * PrimaryKey: id + */ +public class CustomerPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerService.java new file mode 100644 index 0000000..cd02898 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerService.java @@ -0,0 +1,98 @@ +package com.cowr.ssjygl.customer; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Customer; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: customer + * Remarks: 客户 + * PrimaryKey: id + */ +public class CustomerService extends BaseService { + public static final CustomerService me = new CustomerService(); + + public Page find(PageParam pp, String name, Integer del, Integer type) { + String selectsql = "select * "; + String fromsql = "from customer t where 1=1 \n"; + List paraList = new ArrayList<>(); + + if(del == null){ + fromsql += " and t.del = 0 \n"; + }else if (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + if(StrKit.notBlank(name)){ + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + + if(type != null){ + fromsql += " and t.type = ? \n"; + paraList.add(type); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Customer.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + Page page = Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + List list = page.getList(); + + if(!list.isEmpty()) { + List ids = new ArrayList<>(); + + for (Record record : list) { + ids.add(record.getStr("id")); + } + + List prepaycustomers = Db.find(" select t.*, s.name supermarket_name from prepay_customer t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where t.customer_id in(" + StrKit.join(ids, ",") + ")"); + + for (Record record : list) { + int id = record.getInt("id"); + + if (record.get("prepay_customer") == null) { + record.set("prepay_customer", new ArrayList<>()); + } + + for (Record p : prepaycustomers) { + int customer_id = p.getInt("customer_id"); + + if (id == customer_id) { + ((ArrayList) record.get("prepay_customer")).add(p); + } + } + } + } + + return page; + } + + public List list() { + return Customer.dao.find("select * from customer"); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java new file mode 100644 index 0000000..b14c3ec --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/CustomerValidator.java @@ -0,0 +1,44 @@ +package com.cowr.ssjygl.customer; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Customer; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: customer + * Remarks: 客户 + * PrimaryKey: id + */ +public class CustomerValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateString("name", 1, 128, "name", "name 长度 1~128"); + validateString("address", 0, 256, "address", "address 长度 0~256"); + validateString("phone", 0, 11, "phone", "phone 长度 0~11"); + validateString("texpayer_name", 0, 255, "texpayer_name", "texpayer_name 长度 0~255"); + validateString("texpayer_num", 0, 20, "texpayer_num", "texpayer_num 长度 0~20"); + validateString("bank_name", 0, 128, "bank_name", "bank_name 长度 0~128"); + validateString("bank_account", 0, 20, "bank_account", "bank_account 长度 0~20"); + validateString("memo", 0, 256, "memo", "memo 长度 0~256"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Customer.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactPKValidator.java new file mode 100644 index 0000000..f70402f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.customer.contact; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerContact; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_contact + * Remarks: 客户相关 - 客户联系人 + * PrimaryKey: id + */ +public class CustomerContactPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactService.java new file mode 100644 index 0000000..76e662d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactService.java @@ -0,0 +1,79 @@ +package com.cowr.ssjygl.customer.contact; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.CustomerContact; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_contact + * Remarks: 客户相关 - 客户联系人 + * PrimaryKey: id + */ +public class CustomerContactService extends BaseService { + public static final CustomerContactService me = new CustomerContactService(); + + public Page find(PageParam pp, Integer customer_id, String name, String phone, Integer del) { + String selectsql = "select * "; + String fromsql = "from customer_contact t where 1=1 "; + List paraList = new ArrayList<>(); + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (StrKit.notBlank(name)) { + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + if (StrKit.notBlank(phone)) { + fromsql += " and t.phone like ? \n"; + paraList.add("%" + phone + "%"); + } + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && CustomerContact.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list(Integer customer_id) { + String sql = "select t.*, c.name customer_name from customer_contact t \n" + + " left join customer c on c.id = t.customer_id \n" + + " where 1=1 \n"; + List paraList = new ArrayList<>(); + + if(customer_id != null){ + sql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + return Db.find(sql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactValidator.java new file mode 100644 index 0000000..7b417d1 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/contact/CustomerContactValidator.java @@ -0,0 +1,40 @@ +package com.cowr.ssjygl.customer.contact; + +import com.cowr.common.utils.StrUtil; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerContact; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_contact + * Remarks: 客户相关 - 客户联系人 + * PrimaryKey: id + */ +public class CustomerContactValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateInteger("customer_id", 1, 2147483647, "customer_id", "customer_id 范围 1~2147483647"); + validateString("name", 1, 100, "name", "name 长度 1~100"); + validateRegex("phone", StrUtil.regphone, "phone", "phone 必须为手机号格式"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverPKValidator.java new file mode 100644 index 0000000..6853736 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.customer.receiver; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerReceiver; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_receiver + * Remarks: 客户相关 - 客户收获地址 + * PrimaryKey: id + */ +public class CustomerReceiverPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverService.java new file mode 100644 index 0000000..986d337 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverService.java @@ -0,0 +1,107 @@ +package com.cowr.ssjygl.customer.receiver; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.CustomerReceiver; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_receiver + * Remarks: 客户相关 - 客户收获地址 + * PrimaryKey: id + */ +public class CustomerReceiverService extends BaseService { + public static final CustomerReceiverService me = new CustomerReceiverService(); + + public Page find(PageParam pp, Integer customer_id, String name, String phone, Integer supermarket_id) { + String selectsql = "select t.*, c.name customer_name "; + String fromsql = "from customer_receiver t \n" + + " left join customer c on c.id = t.customer_id \n"; + List paraList = new ArrayList<>(); + + if(supermarket_id == null){ + fromsql += " where 1 = 1 \n"; + }else{ + selectsql += " , s.name supermarket_name, sr.distance \n"; + fromsql += " left join supermarket_receiver_distance sr on sr.customer_receiver_id = t.id and sr.supermarket_id = ? \n" + + " left join supermarket s on s.id = sr.supermarket_id and s.id = ?"; + + paraList.add(supermarket_id); + paraList.add(supermarket_id); + } + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (StrKit.notBlank(name)) { + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + if (StrKit.notBlank(phone)) { + fromsql += " and t.phone like ? \n"; + paraList.add("%" + phone + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && CustomerReceiver.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list(Integer customer_id, String name, String phone, Integer supermarket_id) { + String selectsql = "select t.*, c.name customer_name "; + String fromsql = "from customer_receiver t \n" + + " left join customer c on c.id = t.customer_id \n"; + List paraList = new ArrayList<>(); + + if(supermarket_id == null){ + fromsql += " where 1 = 1 \n"; + }else{ + selectsql += " , s.name supermarket_name, sr.distance \n"; + fromsql += " left join supermarket_receiver_distance sr on sr.customer_receiver_id = t.id and sr.supermarket_id = ? \n" + + " left join supermarket s on s.id = sr.supermarket_id and s.id = ?" + + " where 1 = 1 \n"; + + paraList.add(supermarket_id); + paraList.add(supermarket_id); + } + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (StrKit.notBlank(name)) { + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + if (StrKit.notBlank(phone)) { + fromsql += " and t.phone like ? \n"; + paraList.add("%" + phone + "%"); + } + + return Db.find(selectsql + fromsql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverValidator.java new file mode 100644 index 0000000..cd29ba2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/customer/receiver/CustomerReceiverValidator.java @@ -0,0 +1,46 @@ +package com.cowr.ssjygl.customer.receiver; + +import com.cowr.common.utils.StrUtil; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerReceiver; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_receiver + * Remarks: 客户相关 - 客户收获地址 + * PrimaryKey: id + */ +public class CustomerReceiverValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateInteger("customer_id", 1, 2147483647, "customer_id", "customer_id 范围 1~2147483647"); + validateString("name", 1, 128, "name", "name 长度 1~128"); + validateRegex("phone", StrUtil.regphone, "phone", "phone 必须为手机号格式"); + validateString("address", 1, 256, "address", "address 长度 1~256"); + + validateBigDecimal("lgtd", new java.math.BigDecimal(74), new java.math.BigDecimal(135), "lgtd", "lgtd 范围 74~135"); + validateBigDecimal("lttd", new java.math.BigDecimal(3.75), new java.math.BigDecimal(53.7), "lttd", "lttd 范围 3.75~53.7"); + + validateString("memo", 0, 256, "memo", "memo 长度 0~256"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverPKValidator.java new file mode 100644 index 0000000..84022d9 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.driver; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Driver; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: driver + * Remarks: 司机信息 + * PrimaryKey: id + */ +public class DriverPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverService.java new file mode 100644 index 0000000..880be75 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverService.java @@ -0,0 +1,68 @@ +package com.cowr.ssjygl.driver; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Driver; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: driver + * Remarks: 司机信息 + * PrimaryKey: id + */ +public class DriverService extends BaseService { + public static final DriverService me = new DriverService(); + + public Page find(PageParam pp, String name, String phone, Integer trans_co_id, Integer del) { + String selectsql = "select * "; + String fromsql = "from driver t where 1=1 "; + List paraList = new ArrayList<>(); + + if(StrKit.notBlank(name)){ + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + if(StrKit.notBlank(phone)){ + fromsql += " and t.phone like ? \n"; + paraList.add("%" + phone + "%"); + } + + if(trans_co_id != null){ + fromsql += " and t.trans_co_id = ? \n"; + paraList.add(trans_co_id); + } + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Driver.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return Driver.dao.find("select * from driver"); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverValidator.java new file mode 100644 index 0000000..f2c0e6f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/driver/DriverValidator.java @@ -0,0 +1,41 @@ +package com.cowr.ssjygl.driver; + +import com.cowr.common.utils.StrUtil; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Driver; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: driver + * Remarks: 司机信息 + * PrimaryKey: id + */ +public class DriverValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateInteger("trans_co_id", 1, 2147483647, "trans_co_id", "trans_co_id 范围 1~2147483647"); + validateString("name", 1, 8, "name", "name 长度 1~8"); + validateRegex("phone", StrUtil.regphone, "phone", "phone 必须为手机号格式"); + validateString("memo", 0, 256, "memo", "memo 长度 0~256"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Driver.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogController.java new file mode 100644 index 0000000..cb1fa5b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogController.java @@ -0,0 +1,40 @@ +package com.cowr.ssjygl.modifylog; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.ModifyLog; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: modify_log + * Remarks: 配置相关表修改日志记录 + * PrimaryKey: id + */ +public class ModifyLogController extends Controller { + + /** + * 分页查找 modify_log 配置相关表修改日志记录 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(ModifyLogService.me.find(pp))); + } + + /** + * 按主键查找单个对象 modify_log 配置相关表修改日志记录 + */ + @Before(ModifyLogPKValidator.class) + public void get(){ + ModifyLog model = getModel(ModifyLog.class, "", true); // 忽略不在model中的字段 + renderJson(ModifyLogService.me.get(model)); + } + + /** + * 返回所有 modify_log 配置相关表修改日志记录 + */ + public void list(){ + renderJson(Result.object(ModifyLogService.me.list())); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogPKValidator.java new file mode 100644 index 0000000..690246d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.modifylog; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.ModifyLog; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: modify_log + * Remarks: 配置相关表修改日志记录 + * PrimaryKey: id + */ +public class ModifyLogPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateLong("id", 1, 9223372036854775807L, "id", "id 范围 1~9223372036854775807"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogService.java new file mode 100644 index 0000000..1738312 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/modifylog/ModifyLogService.java @@ -0,0 +1,137 @@ +package com.cowr.ssjygl.modifylog; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseModel; +import com.cowr.common.base.BaseService; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.ModifyLog; +import com.cowr.model.Sysuser; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 只处理用户修改数据相关的 + * 系统自动修改的,根据调试需要,选择性存日志表 + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: modify_log + * Remarks: 配置相关表修改日志记录 + * PrimaryKey: id + */ +public class ModifyLogService { + public static final ModifyLogService me = new ModifyLogService(); + + /** + * 只保存修改的部分 + * @param table + * @param pks + * @param editdata + * @param type + * @param sysuser + * @return + */ + public boolean save(String table, String pks, String editdata, int type, Sysuser sysuser){ + ModifyLog modify = new ModifyLog(); + modify.setTable(table); + modify.setPks(pks); + modify.setEditdata(editdata); + modify.setType(type); + modify.setCreateUserId(sysuser.getId()); + modify.setCreateUserName(sysuser.getName()); + + return modify.save(); + } + + /** + * 保存配置修改日志 + * + * @param newobj + * @param oldobj + * @param type + * @param sysuser + * @return + */ + public boolean save(BaseModel newobj, BaseModel oldobj, int type, Sysuser sysuser) { + String[] pkeys = newobj.getPKey(); + ModifyLog modify = new ModifyLog(); + modify.setTable(newobj.getTablename()); + modify.setPks(StrUtil.join(Arrays.asList(pkeys), ",")); + modify.setType(type); + modify.setNewdata(newobj.toJson()); + if (oldobj != null) { + modify.setOlddata(oldobj.toJson()); + } + modify.setCreateUserId(sysuser.getId()); + modify.setCreateUserName(sysuser.getName()); + + return modify.save(); + } + + public boolean batchSave(List newlist, List oldlist, int type, Sysuser sysuser) { + List mls = new ArrayList<>(); + for (int i = 0, len = newlist.size(); i < len; i++) { + BaseModel newobj = (BaseModel) newlist.get(i); + String[] pkeys = newobj.getPKey(); + ModifyLog modify = new ModifyLog(); + modify.setTable(newobj.getTablename()); + modify.setPks(StrUtil.join(Arrays.asList(pkeys), ",")); + modify.setType(type); + modify.setNewdata(newobj.toJson()); + if (oldlist != null) { + BaseModel oldobj = oldlist.get(i); + if (oldobj != null) { + modify.setOlddata(oldobj.toJson()); + } + } + modify.setCreateUserId(sysuser.getId()); + modify.setCreateUserName(sysuser.getName()); + + mls.add(modify); + } + + return Db.batchSave(mls, mls.size()).length == mls.size(); + } + + /** + * 按主键查单个对象 + * + * @param model BaseModel + * @return Result + */ + public Result get(BaseModel model) { + return Result.object(model.findByPk(), "按主键未找到记录"); + } + + public Page find(PageParam pp) { + String selectsql = "select * "; + String fromsql = "from modify_log t where 1=1 "; + List paraList = new ArrayList<>(); + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && ModifyLog.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return ModifyLog.dao.find("select * from modify_log"); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderCancelValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderCancelValidator.java new file mode 100644 index 0000000..b0341ef --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderCancelValidator.java @@ -0,0 +1,20 @@ +package com.cowr.ssjygl.order; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * 取消订单验证 + */ +public class OrderCancelValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateString("sn", 16, 16, "sn", "sn 长度 16"); + validateRequired("password", "password", "password 必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderSnValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderSnValidator.java new file mode 100644 index 0000000..c67d146 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderSnValidator.java @@ -0,0 +1,19 @@ +package com.cowr.ssjygl.order; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * 订单验证 + */ +public class OrderSnValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateString("order_sn", 16, 16, "order_sn", "order_sn 长度 16"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderStateValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderStateValidator.java new file mode 100644 index 0000000..66a4fff --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/OrderStateValidator.java @@ -0,0 +1,28 @@ +package com.cowr.ssjygl.order; + + +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.util.List; + +/** + * Generated by COWR Thu Jun 27 17:01:16 CST 2019 + * TableName: order + * Remarks: 订单 + * PrimaryKey: sn + */ +public class OrderStateValidator extends CrudParamValidator { + private static List chkstate = OrderStateEnum.getStateIdArr(); + + @Override + protected void validate(Controller c) { + validateInIntegerArray("state", chkstate, "state", "state 可选值 2、3、4、5、9"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/SnValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/SnValidator.java new file mode 100644 index 0000000..bf63d51 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/SnValidator.java @@ -0,0 +1,19 @@ +package com.cowr.ssjygl.order; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * 订单验证 + */ +public class SnValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateString("sn", 16, 16, "sn", "sn 长度 16"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterPKValidator.java new file mode 100644 index 0000000..484ea18 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.order.ordercluster; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Ordercluster; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: ordercluster + * Remarks: 订单相关 - 订单 + * PrimaryKey: id + */ +public class OrderclusterPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java new file mode 100644 index 0000000..bca8e18 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterService.java @@ -0,0 +1,309 @@ +package com.cowr.ssjygl.order.ordercluster; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.view.PageParam; +import com.cowr.model.Ordercluster; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: ordercluster + * Remarks: 订单相关 - 订单 + * PrimaryKey: id + *

+ * ALTER TABLE `order_temp` ADD INDEX `order_sale_ordercluster_id`(`ordercluster_id`); + * ALTER TABLE `order_temp` ADD INDEX `order_temp_ordercluster_id`(`ordercluster_id`); + * ALTER TABLE `ordercluster` DROP COLUMN `over_weight`; + */ +public class OrderclusterService extends BaseService { + public static final OrderclusterService me = new OrderclusterService(); + + public Page find(PageParam pp, + Integer supermarket_id, + Integer trans_co_id, + Integer customer_id, + String customer_name, + String stm, + String etm, + Integer state, + Integer product_id + ) { + String selectsql = "select t.*, s.name supermarket_name "; + String fromsql = "from ordercluster t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (trans_co_id != null) { + fromsql += " and t.trans_co_id = ? "; + paraList.add(trans_co_id); + } + + if (state != null) { + fromsql += " and t.state = ? "; + paraList.add(state); + } + + if (StrKit.notBlank(customer_name)) { + fromsql += " and t.customer_name like ? \n"; + paraList.add("%" + customer_name + "%"); + } + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ? \n"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ? \n"; + paraList.add(etm); + } + + if (product_id != null) { + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Ordercluster.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + Page page = Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + List list = page.getList(); + + setOverWeight(list); + + return page; + } + + /** + * 查询未完成的集团订单 + * + * @param supermarket_id + * @param customer_id + * @return + */ + public List undoneOrdercluster(int supermarket_id, Integer customer_id) { + String sql = "select * from ordercluster t \n" + + " where t.state < ? \n" + + " and t.supermarket_id = ? \n"; + List paraList = new ArrayList<>(); + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + paraList.add(supermarket_id); + + if (customer_id != null) { + sql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + List list = Db.find(sql, paraList.toArray()); + + setOverWeight(list); + + return list; + } + + public void setOverWeight(List list) { + // 使用已完成的订单动态计算剩余量 + if (list == null || list.isEmpty()) { + return; + } + + StringBuilder ids = new StringBuilder(); + Map map = new HashMap<>(); + for (Record record : list) { + if (ids.length() > 0) { + ids.append(", "); + } + + record.set("over_weight", record.get("total_weight")); // 默认用 total_weight 填充,下面根据实际的数据覆盖 + record.set("complete_weight", 0); + + ids.append(record.getStr("id")); + map.put(record.getInt("id"), record); + } + + String sql = "select t.ordercluster_id, sum(t.weight) weight from order_sale t \n" + + " where t.state = ? \n" + + " and t.ordercluster_id in(" + ids.toString() + ") \n" + + " group by t.ordercluster_id \n" + + " union \n" + + " select t.ordercluster_id, sum(t.weight) weight from order_temp t \n" + + " where t.state = ? \n" + + " and t.ordercluster_id in(" + ids.toString() + ") \n" + + " group by t.ordercluster_id "; + + List orderlist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), OrderStateEnum.RECEIVED.getStateid()); + + for (Record cli : orderlist) { + int ordercluster_id = cli.getInt("ordercluster_id"); + BigDecimal weight = cli.getBigDecimal("weight"); + + if (map.containsKey(ordercluster_id) && weight != null) { + Record record = map.get(ordercluster_id); + if (record.getBigDecimal("total_weight").compareTo(weight) == 0) { + record.set("over_weight", 0); + } else { + record.set("over_weight", record.getBigDecimal("total_weight").subtract(weight).setScale(2, BigDecimal.ROUND_HALF_UP)); + } + + record.set("complete_weight", weight.setScale(2, BigDecimal.ROUND_HALF_UP)); + } + } + } + + /** + * 查询集团订单的子订单 + * + * @param pp + * @param ordercluster_id + * @param sn + * @param truck_license + * @param stm + * @param etm + * @param isprepaid + * @param product_id + * @param state + * @return + */ + public Page findChildren(PageParam pp, + int ordercluster_id, + String sn, + String truck_license, + String stm, + String etm, + Integer isprepaid, + Integer product_id, + Integer state + ) { + String salesql = "select \n" + + " t.sn, t.uuid, t.transport_id, t.supermarket_id\n" + + " , t.customer_id, t.customer_name, t.customer_texpayer_name, t.customer_texpayer_num, t.customer_address\n" + + " , t.customer_phone, t.customer_bank_name, t.customer_bank_account\n" + + " , t.customer_receiver_name, t.customer_receiver_phone, t.customer_receiver_address, t.customer_receiver_lgtd, t.customer_receiver_lttd\n" + + " , t.trans_co_id, t.trans_co_name, t.trans_co_texpayer_name, t.trans_co_texpayer_num, t.trans_co_address, t.trans_co_phone, t.trans_co_bank_name, t.trans_co_bank_account\n" + + " , t.truck_license, t.driver_name, t.driver_phone\n" + + " , t.unit_price, t.total_price, t.weight, t.paid, t.pick_time, t.trans_distance\n" + + " , t.trans_price, t.trans_unit_price\n" + + " , t.pay_type, t.create_time, t.create_user_id, t.create_user_name\n" + + " , t.settlement_user_id, t.settlement_user_name, t.state, t.req_receipt, t.ordercluster_id\n" + + " , t.change_time, t.isprepaid, t.memo, t.product_id, t.product_name, t.prepay_customer_id, 1 type\n" + + " from order_sale t\n" + + " where t.ordercluster_id = ? \n"; + + String tempsql = "select \n" + + " t.sn, t.uuid, t.transport_id, t.supermarket_id\n" + + " , t.customer_id, t.customer_name, t.customer_texpayer_name, t.customer_texpayer_num, t.customer_address\n" + + " , t.customer_phone, t.customer_bank_name, t.customer_bank_account\n" + + " , t.customer_receiver_name, t.customer_receiver_phone, t.customer_receiver_address, t.customer_receiver_lgtd, t.customer_receiver_lttd\n" + + " , t.trans_co_id, t.trans_co_name, t.trans_co_texpayer_name, t.trans_co_texpayer_num, t.trans_co_address, t.trans_co_phone, t.trans_co_bank_name, t.trans_co_bank_account\n" + + " , t.truck_license, null driver_name, null driver_phone\n" + + " , t.unit_price, t.total_price, t.weight, t.paid, null pick_time\n" + + " , null trans_distance, null trans_price, null trans_unit_price\n" + + " , t.pay_type, t.create_time, t.create_user_id, t.create_user_name\n" + + " , t.settlement_user_id, t.settlement_user_name, t.state, null req_receipt, t.ordercluster_id\n" + + " , t.change_time, t.isprepaid, t.memo, t.product_id, t.product_name, t.prepay_customer_id, 3 type\n" + + " from order_temp t\n" + + " where t.ordercluster_id = ? \n"; + + List salePara = new ArrayList<>(); + List tempPara = new ArrayList<>(); + + salePara.add(ordercluster_id); + tempPara.add(ordercluster_id); + + if (StrKit.notBlank(sn)) { + salesql += " and t.sn like ? \n"; + tempsql += " and t.sn like ? \n"; + + salePara.add("%" + sn + "%"); + tempPara.add("%" + sn + "%"); + } + + if (StrKit.notBlank(truck_license)) { + salesql += " and t.truck_license like ? \n"; + tempsql += " and t.truck_license like ? \n"; + + salePara.add("%" + truck_license + "%"); + tempPara.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(stm)) { + salesql += " and t.create_time >= ? \n"; + tempsql += " and t.create_time >= ? \n"; + + salePara.add(stm); + tempPara.add(stm); + } + + if (StrKit.notBlank(etm)) { + salesql += " and t.create_time <= ? \n"; + tempsql += " and t.create_time <= ? \n"; + + salePara.add(etm); + tempPara.add(etm); + } + + + if (isprepaid != null) { + salesql += " and t.isprepaid = ? \n"; + tempsql += " and t.isprepaid = ? \n"; + + salePara.add(isprepaid); + tempPara.add(isprepaid); + } + + if (product_id != null) { + salesql += " and t.product_id = ? \n"; + tempsql += " and t.product_id = ? \n"; + + salePara.add(product_id); + tempPara.add(product_id); + } + + if (state != null) { + salesql += " and t.state = ? \n"; + tempsql += " and t.state = ? \n"; + + salePara.add(state); + tempPara.add(state); + } + + String fromsql = " from ( " + salesql + " \n union \n" + tempsql + "\n ) a order by a.create_time desc"; + + salePara.addAll(tempPara); + + return Db.paginate(pp.getPage(), pp.getSize(), "select * ", fromsql, salePara.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterValidator.java new file mode 100644 index 0000000..50726b3 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordercluster/OrderclusterValidator.java @@ -0,0 +1,68 @@ +package com.cowr.ssjygl.order.ordercluster; + +import com.cowr.common.utils.StrUtil; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Ordercluster; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: ordercluster + * Remarks: 订单相关 - 订单 + * PrimaryKey: id + */ +public class OrderclusterValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateString("uuid", 1, 32, "uuid", "uuid 长度 1~32"); + + validateBigDecimal("total_weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "total_weight", "total_weight 范围 0~9.9999999999E10"); + + if (StrKit.notBlank(c.get("avg_weight"))) { // 可为空字段,当传入值时,才做验证 + validateBigDecimal("avg_weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "avg_weight", "avg_weight 范围 0~9.9999999999E10"); + } + + validateString("cutoff_time", 1, 19, "cutoff_time", "cutoff_time 长度 1~19"); + validateDate("cutoff_time", "yyyy-MM-dd HH:mm:ss", false, "cutoff_time", "cutoff_time 格式 yyyy-MM-dd HH:mm:ss"); // 默认时间时间字符串格式,生成后根据情况调整 + + validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647"); + validateInteger("pay_type", 0, 1, "pay_type", "pay_type 范围 0~1"); + validateInteger("req_receipt", 0, 1, "req_receipt", "req_receipt 范围 0~1"); + validateInteger("product_id", 1, 2147483647, "product_id", "product_id 范围 1~2147483647"); + validateInteger("customer_id", 1, 2147483647, "customer_id", "customer_id 范围 1~2147483647"); + + + // 选了物流公司,就必须填收获地址,运距 + if (StrKit.notBlank(c.get("trans_co_id"))) { // 可为空字段,当传入值时,才做验证 + validateInteger("trans_co_id", 1, 2147483647, "trans_co_id", "trans_co_id 范围 1~2147483647"); + + validateBigDecimal("trans_distance", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "trans_distance", "trans_distance 范围 0~9.9999999999E10"); + + validateString("customer_receiver_name", 1, 8, "customer_receiver_name", "customer_receiver_name 长度 0~8"); + validateRegex("customer_receiver_phone", StrUtil.regphone, "customer_receiver_phone", "customer_receiver_phone 必须为手机号格式"); + validateString("customer_receiver_address", 1, 256, "customer_receiver_address", "customer_receiver_address 长度 0~256"); + validateBigDecimal("customer_receiver_lgtd", new java.math.BigDecimal(74), new java.math.BigDecimal(135), "customer_receiver_lgtd", "customer_receiver_lgtd 范围 74~135"); + validateBigDecimal("customer_receiver_lttd", new java.math.BigDecimal(3.75), new java.math.BigDecimal(53.7), "customer_receiver_lttd", "customer_receiver_lttd 范围 3.75~53.7"); + } + + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Ordercluster.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchasePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchasePKValidator.java new file mode 100644 index 0000000..6d085fa --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchasePKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.order.orderpurchase; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.OrderPurchase; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_purchase + * Remarks: 订单相关 - 从采购点购买 + * PrimaryKey: sn + */ +public class OrderPurchasePKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("sn", "sn", "sn 必填"); + validateString("sn", 1, 16, "sn", "sn 长度 1~16"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchaseService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchaseService.java new file mode 100644 index 0000000..76a872a --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/orderpurchase/OrderPurchaseService.java @@ -0,0 +1,126 @@ +package com.cowr.ssjygl.order.orderpurchase; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.OrderPurchase; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_purchase + * Remarks: 订单相关 - 从采购点购买 + * PrimaryKey: sn + */ +public class OrderPurchaseService extends BaseService { + public static final OrderPurchaseService me = new OrderPurchaseService(); + + /** + * 按 sn 查询单个订单信息 + * @param sn + * @return + */ + public Record get(String sn) { + return Db.findFirst("select t.*" + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", e.name purchase_name " + + " from order_purchase t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join purchase e on e.id = t.purchase_id \n" + + " where t.sn = ?", sn); + } + + public Page find(PageParam pp, + String sn, + String truck_license, + Integer supermarket_id, + Integer purchase_id, + String stm, + String etm, + Integer product_id, + Integer state + ) { + String selectsql = "select t.* " + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name, e.name purchase_name \n"; + String fromsql = "from order_purchase t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join purchase e on e.id = t.purchase_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(sn)) { + fromsql += " and t.sn like ? \n"; + paraList.add("%" + sn + "%"); + } + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ? \n"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ? \n"; + paraList.add(etm); + } + + if (purchase_id != null) { + fromsql += " and t.purchase_id = ? \n"; + paraList.add(purchase_id); + } + + if (product_id != null) { + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + if (state != null) { + fromsql += " and t.state = ? \n"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && OrderPurchase.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.create_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSalePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSalePKValidator.java new file mode 100644 index 0000000..98efe12 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSalePKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.order.ordersale; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.OrderSale; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_sale + * Remarks: 订单相关 - 销售单 + * PrimaryKey: sn + */ +public class OrderSalePKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("sn", "sn", "sn 必填"); + validateString("sn", 1, 16, "sn", "sn 长度 1~16"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSaleService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSaleService.java new file mode 100644 index 0000000..f876320 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordersale/OrderSaleService.java @@ -0,0 +1,155 @@ +package com.cowr.ssjygl.order.ordersale; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.OrderSale; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_sale + * Remarks: 订单相关 - 销售单 + * PrimaryKey: sn + */ +public class OrderSaleService extends BaseService { + public static final OrderSaleService me = new OrderSaleService(); + + /** + * 按 sn 查询单个订单信息 + * @param sn + * @return + */ + public Record get(String sn) { + return Db.findFirst("select t.*" + + ", p.order_sn " + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name \n" + + " from order_sale t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where t.sn = ?", sn); + } + + /** + * @param pp + * @param sn + * @param truck_license + * @param supermarket_id + * @param trans_co_id + * @param customer_id + * @param customer_name + * @param stm 创建时间 + * @param etm + * @param isprepaid + * @return + */ + public Page find(PageParam pp, + String sn, + String truck_license, + Integer supermarket_id, + Integer trans_co_id, + Integer customer_id, + String customer_name, + String stm, + String etm, + Integer isprepaid, + Integer product_id, + Integer state + ) { + String selectsql = "select t.*" + + ", p.order_sn " + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo, s.name supermarket_name \n"; + String fromsql = "from order_sale t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(sn)) { + fromsql += " and t.sn like ? \n"; + paraList.add("%" + sn + "%"); + } + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (trans_co_id != null) { + fromsql += " and t.trans_co_id = ? "; + paraList.add(trans_co_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(customer_name)) { + fromsql += " and t.customer_name like ? \n"; + paraList.add("%" + customer_name + "%"); + } + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ? \n"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ? \n"; + paraList.add(etm); + } + + if (isprepaid != null) { + fromsql += " and t.isprepaid = ? \n"; + paraList.add(isprepaid); + } + + if (product_id != null) { + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + if (state != null) { + fromsql += " and t.state = ? \n"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && OrderSale.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.create_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempPKValidator.java new file mode 100644 index 0000000..f826c97 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.order.ordertemp; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.OrderTemp; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_temp + * Remarks: 订单相关 - 外销单 + * PrimaryKey: sn + */ +public class OrderTempPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("sn", "sn", "sn 必填"); + validateString("sn", 1, 16, "sn", "sn 长度 1~16"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java new file mode 100644 index 0000000..a293469 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertemp/OrderTempService.java @@ -0,0 +1,136 @@ +package com.cowr.ssjygl.order.ordertemp; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.OrderTemp; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_temp + * Remarks: 订单相关 - 外销单 + * PrimaryKey: sn + */ +public class OrderTempService extends BaseService { + public static final OrderTempService me = new OrderTempService(); + + /** + * 按 sn 查询单个订单信息 + * + * @param sn + * @return + */ + public Record get(String sn) { + return Db.findFirst("select t.*" + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name from order_temp t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where t.sn = ?", sn); + } + + public Page find(PageParam pp, + String sn, + String truck_license, + Integer supermarket_id, + Integer customer_id, + String customer_name, + String stm, + String etm, + Integer isprepaid, + Integer product_id, + Integer state + ) { + String selectsql = "select t.* " + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo, s.name supermarket_name \n"; + String fromsql = "from order_temp t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(sn)) { + fromsql += " and t.sn like ? \n"; + paraList.add("%" + sn + "%"); + } + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(customer_name)) { + fromsql += " and t.customer_name like ? \n"; + paraList.add("%" + customer_name + "%"); + } + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ? \n"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ? \n"; + paraList.add(etm); + } + + if (isprepaid != null) { + fromsql += " and t.isprepaid = ? \n"; + paraList.add(isprepaid); + } + + if (product_id != null) { + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + if (state != null) { + fromsql += " and t.state = ? \n"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && OrderTemp.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.create_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferPKValidator.java new file mode 100644 index 0000000..c661096 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.order.ordertransfer; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.OrderTransfer; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_transfer + * Remarks: 订单相关 - 转运单 + * PrimaryKey: sn + */ +public class OrderTransferPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("sn", "sn", "sn 必填"); + validateString("sn", 1, 16, "sn", "sn 长度 1~16"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferService.java new file mode 100644 index 0000000..501aa59 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertransfer/OrderTransferService.java @@ -0,0 +1,131 @@ +package com.cowr.ssjygl.order.ordertransfer; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.OrderTransfer; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_transfer + * Remarks: 订单相关 - 转运单 + * PrimaryKey: sn + */ +public class OrderTransferService extends BaseService { + public static final OrderTransferService me = new OrderTransferService(); + + /** + * 按 sn 查询单个订单信息 + * + * @param sn + * @return + */ + public Record get(String sn) { + return Db.findFirst( + " select t.*" + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name, f.name sandfarm_name \n" + + " from order_transfer t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join sandfarm f on f.id = t.sandfarm_id \n" + + " where t.sn = ?", sn + + ); + } + + public Page find(PageParam pp, + String sn, + String truck_license, + Integer supermarket_id, + Integer sandfarm_id, + String stm, + String etm, + Integer product_id, + Integer state + ) { + String selectsql = "select t.* " + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name, f.name sandfarm_name \n"; + String fromsql = "from order_transfer t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join sandfarm f on f.id = t.sandfarm_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(sn)) { + fromsql += " and t.sn like ? \n"; + paraList.add("%" + sn + "%"); + } + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ? \n"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ? \n"; + paraList.add(etm); + } + + if (sandfarm_id != null) { + fromsql += " and t.sandfarm_id = ? \n"; + paraList.add(sandfarm_id); + } + + if (product_id != null) { + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + if (state != null) { + fromsql += " and t.state = ? \n"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && OrderTransfer.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.create_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashPKValidator.java new file mode 100644 index 0000000..c4c934f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashPKValidator.java @@ -0,0 +1,26 @@ +package com.cowr.ssjygl.order.ordertrash; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.OrderTrash; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_trash + * Remarks: 订单相关 - 废料运出单 + + * PrimaryKey: sn + */ +public class OrderTrashPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("sn", "sn", "sn 必填"); + validateString("sn", 1, 16, "sn", "sn 长度 1~16"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashService.java new file mode 100644 index 0000000..9cf7b13 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/order/ordertrash/OrderTrashService.java @@ -0,0 +1,117 @@ +package com.cowr.ssjygl.order.ordertrash; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.OrderTrash; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: order_trash + * Remarks: 订单相关 - 废料运出单 + + * PrimaryKey: sn + */ +public class OrderTrashService extends BaseService { + public static final OrderTrashService me = new OrderTrashService(); + + /** + * 按 sn 查询单个订单信息 + * @param sn + * @return + */ + public Record get(String sn) { + return Db.findFirst("select t.* " + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name from order_trash t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where t.sn = ?", sn); + } + + public Page find(PageParam pp, + String sn, + String truck_license, + Integer supermarket_id, + String stm, + String etm, + Integer product_id, + Integer state + ) { + String selectsql = "select t.* " + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo, s.name supermarket_name \n"; + String fromsql = "from order_trash t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(sn)) { + fromsql += " and t.sn like ? \n"; + paraList.add("%" + sn + "%"); + } + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ? \n"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ? \n"; + paraList.add(etm); + } + + if (product_id != null) { + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + if (state != null) { + fromsql += " and t.state = ? \n"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && OrderTrash.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.create_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayController.java new file mode 100644 index 0000000..d9cdfa1 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayController.java @@ -0,0 +1,74 @@ +package com.cowr.ssjygl.prepay; + +import com.cowr.common.base.BaseController; +import com.cowr.common.validator.CustomerIdValidator; +import com.cowr.common.validator.StartAndEndTimeValidator; +import com.cowr.common.view.ExcelRender; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.prepay.prepaydetail.PrepayDetailService; +import com.jfinal.aop.Before; +import org.apache.poi.ss.usermodel.Workbook; + +public class PrepayController extends BaseController { + public void find() { + String name = get("name"); + Integer customer_id = getInt("customer_id"); + Integer supermarket_id = getInt("supermarket_id"); + String stm = get("stm"); + String etm = get("etm"); + Double start = getParaToDouble("start"); + Double end = getParaToDouble("end"); + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(PrepayService.me.find(pp, name, customer_id, supermarket_id, stm, etm, start, end))); + } + + @Before(StartAndEndTimeValidator.class) + public void consumption() { + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer customer_id = getInt("customer_id"); + Integer supermarket_id = getInt("supermarket_id"); + String stm = get("stm"); + String etm = get("etm"); + + if (export == 0) { + renderJson(Result.success(PrepayService.me.consumption(customer_id, supermarket_id, stm, etm))); + } else { + Workbook wb = PrepayService.me.consumptionExport(customer_id, supermarket_id, stm, etm); + render(new ExcelRender("消费记录_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + @Before(StartAndEndTimeValidator.class) + public void flow() { + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer customer_id = getInt("customer_id"); + String stm = get("stm"); + String etm = get("etm"); + + if (export == 0) { + renderJson(Result.success(PrepayService.me.flow(customer_id, stm, etm))); + } else { + Workbook wb = PrepayService.me.flowExport(customer_id, stm, etm); + render(new ExcelRender("客户流水_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 返回 prepay_detail 预付费客户付费详情 + */ + @Before(StartAndEndTimeValidator.class) + public void prepaydetail() { + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer customer_id = getInt("customer_id"); + String stm = get("stm"); + String etm = get("etm"); + + if (export == 0) { + renderJson(Result.object(PrepayDetailService.me.list(customer_id, stm, etm))); + } else { + Workbook wb = PrepayDetailService.me.listExport(customer_id, stm, etm); + render(new ExcelRender("付费详情_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayService.java new file mode 100644 index 0000000..5e1e5a9 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/PrepayService.java @@ -0,0 +1,694 @@ +package com.cowr.ssjygl.prepay; + +import com.cowr.common.utils.DateTimeUtil; +import com.cowr.model.*; +import com.cowr.ssjygl.CacheData; +import com.cowr.common.Const; +import com.cowr.common.utils.DataUtil; +import com.cowr.common.view.PageParam; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.ssjygl.customer.receiver.CustomerReceiverService; +import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class PrepayService { + private static Log log = Log.getLog(PrepayService.class); + public static PrepayService me = new PrepayService(); + + /** + * 预付费用户列表 + * + * @param pp 分页参数 + * @param name 客户名称 + * @param customer_id 客户id + * @param supermarket_id 超时id + * @param stm 开始时间 + * @param etm 截止时间 + * @param start 开始金额 + * @param end 截止金额 + * @return + */ + public Page find(PageParam pp, String name, Integer customer_id, Integer supermarket_id, String stm, String etm, Double start, Double end) { + String selectsql = " select p.*, c.name customer_name, c.address, c.texpayer_name, c.texpayer_num, c.memo, pc.surplus, s.name supermarket_name \n"; + String fromsql = " from ( \n" + + " select t.customer_id, t.supermarket_id, max(t.create_time) maxtm, max(t.id) maxid from prepay_detail t \n" + + " where t.state = 2 \n" + + " group by t.customer_id, t.supermarket_id\n" + + " ) a \n" + + " left join prepay_detail p on p.id = a.maxid \n" + + " left join customer c on c.id = p.customer_id \n" + + " left join prepay_customer pc on pc.customer_id = p.customer_id and pc.supermarket_id = a.supermarket_id\n" + + " left join supermarket s on s.id = a.supermarket_id\n" + + " where 1 = 1"; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(name)) { + fromsql += " and c.name like ? \n"; + paraList.add("%" + name + "%"); + } + + if (customer_id != null) { + fromsql += " and a.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (supermarket_id != null) { + fromsql += " and a.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and p.create_time >= ?"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and p.create_time <= ?"; + paraList.add(etm); + } + + if (start != null) { + fromsql += " and pc.surplus >= ?"; + paraList.add(start); + } + + if (end != null) { + fromsql += " and pc.surplus <= ?"; + paraList.add(end); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && + (PrepayDetail.dao.hasColunm(pp.getSort_field()) || Customer.dao.hasColunm(pp.getSort_field())) + ) { + findSql += " order by p." + pp.getSort_field() + " is null, p." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by p.change_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public Record prepayInfo(Transport transport) { + if (transport == null) { + return null; + } + + PrepayTruck pt = PrepayTruck.dao.findFirst("select * from prepay_truck t \n" + + " where t.supermarket_id = ? \n" + + " and t.truck_license = ? \n" + + " and t.valid_date = ? ", + transport.getSupermarketId(), + transport.getTruckLicense(), + DateTimeUtil.sdf.get().format(transport.getInTime()) + ); + + if (pt == null) { + return null; + } + + Customer customer = Customer.dao.findById(pt.getCustomerId()); + + if (customer == null) { + return null; + } + + if (customer.getType() == 0) { + log.error("当前用户不是预付用户 customer id " + customer.getId()); + return null; + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), transport.getSupermarketId()); + + if (prepayCustomer == null) { + log.debug("未找到预付费信息 %s, %s" + customer.getId() + ", " + transport.getSupermarketId()); + return null; + } + + PrepayDetail pd = PrepayDetail.dao.findFirst( + "select * from prepay_detail t where t.customer_id = ? \n" + + " order by t.create_time desc limit 0,1", customer.getId()); + + if (pd == null) { + return null; + } + + Record out = new Record(); + + out.set("prepay_truck", true); + out.set("prepay_threshold", prepayCustomer.getThreshold()); + out.set("prepay_truck_type", pt.getType()); + out.set("prepay_customer_id", customer.getId()); + out.set("prepay_customer_name", customer.getName()); + out.set("prepay_contact_name", pd.getContactName()); + out.set("prepay_contact_phone", pd.getContactPhone()); + out.set("prepay_surplus", prepayCustomer.getSurplus()); + out.set("prepay_customer", customer); + out.set("prepay_customer_info", prepayCustomer); + + Truck truck = Truck.dao.findById(transport.getTruckLicense()); + + if(truck != null){ + // 预付费关联集团客户订单 + List list = Db.find("select t.*, c.`name` customer_name from ordercluster t\n" + + " left join customer c on c.id = t.customer_id\n" + + " where t.state < ? \n" + + " and t.supermarket_id = ? \n" + + " and t.trans_co_id = ? \n" + + " and t.customer_id = ? ", + OrderStateEnum.RECEIVED.getStateid(), + transport.getSupermarketId(), + truck.getTransCoId(), + pt.getCustomerId() + ); + + out.set("prepay_ordercluster", list); + } + + List list = CustomerReceiverService.me.list(customer.getId(), null, null, transport.getSupermarketId()); + + out.set("prepay_customer_receiver", list); + + return out; + } + + /** + * 消费查询 + * + * @param customer_id + * @param supermarket_id + * @param stm + * @param etm + * @return + */ + public List consumption(Integer customer_id, Integer supermarket_id, String stm, String etm) { + String sql = "select a.sn \n" + + " ,p.order_sn \n" + + " ,p.arrive_time \n" + + " ,p.type \n" + + " ,a.supermarket_id \n" + + " ,s.`name` supermarket_name \n" + + " ,a.truck_license \n" + + " ,a.weight \n" + + " ,a.total_price \n" + + " ,a.paid \n" + + " ,a.customer_id \n" + + " ,a.customer_name \n" + + " from ( \n" + + " select t.sn, t.supermarket_id, t.truck_license, t.weight, t.total_price, t.paid, c.id customer_id, c.name customer_name \n" + + " from order_sale t \n" + + " left join customer c on c.id = t.customer_id \n" + + " where t.state = ? \n" + + " and t.isprepaid = 1 \n" + + " and t.prepay_customer_id is not null \n" + + " and t.create_time >= ? \n" + + " and t.create_time <= ? \n" + + " union \n" + + " select t.sn, t.supermarket_id, t.truck_license, t.weight, t.total_price, t.paid, c.id customer_id, c.name customer_name \n" + + " from order_temp t \n" + + " left join customer c on c.id = t.customer_id \n" + + " where t.state = ? \n" + + " and t.isprepaid = 1 \n" + + " and t.prepay_customer_id is not null \n" + + " and t.create_time >= ? \n" + + " and t.create_time <= ? \n" + + " ) a \n" + + " left join supermarket s on s.id = a.supermarket_id \n" + + " left join transport p on p.order_sn = a.sn " + + " where 1 = 1 \n"; + + List paraList = new ArrayList<>(); + + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + paraList.add(stm); + paraList.add(etm); + + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + paraList.add(stm); + paraList.add(etm); + + if (supermarket_id != null && supermarket_id > 0) { + sql += " and a.supermarket_id = ?"; + paraList.add(supermarket_id); + } + + if (customer_id != null && customer_id > 0) { + sql += " and a.customer_id = ?"; + paraList.add(customer_id); + } + + return Db.find(sql, paraList.toArray()); + } + + public Workbook consumptionExport(Integer customer_id, Integer supermarket_id, String stm, String etm) { + Customer customer = Customer.dao.findById(customer_id); + String cname = ""; + + if (customer != null) { + cname = customer.getName(); + } + + List list = consumption(customer_id, supermarket_id, stm, etm); + + list.sort(new Comparator() { + public int compare(Record o1, Record o2) { + long d1 = o1.getDate("arrive_time").getTime(); + long d2 = o2.getDate("arrive_time").getTime(); + + if (d1 > d2) { + return 1; + } else if (d1 == d2) { + return 0; + } + + return -1; + } + }); + + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(cname + " 消费记录"); + + // 标题 start + Font font = wb.createFont(); + font.setBold(true); + font.setFontHeight((short) (18 * 20)); + font.setFontName("宋体"); + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); + cell.setCellValue(CacheData.print_vendor); + row.setHeight((short) (40 * 20)); // POI中的行高单位是twips(缇) ,Office Excel行高单位是pt(磅) 设置的行高,单位为1/20pt + cell.setCellStyle(cellStyle); + // 标题 end + + // 副标题 start + String subtitle = cname; + try { + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdfhms.get().parse(stm)) + " ~ " + DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdfhms.get().parse(etm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += "消费记录"; + font = wb.createFont(); + font.setFontHeight((short) (12 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(1); + row.setHeight((short) (28 * 20)); + cell = row.createCell(0); + cell.setCellValue(subtitle); + cell.setCellStyle(cellStyle); + // 副标题 end + + // 设置表头 + // 表头 start + font = wb.createFont(); + cellStyle = wb.createCellStyle(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + cellStyle.setFont(font); + + row = sheet.createRow(2); + 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("金额"); + // 表头 end + + int end_col = 5; + int datalen = list.size(); + double sum_weight = 0.0; + double sum_price = 0.0; + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + + sum_weight += DataUtil.getDefaultByRecord(record, "weight"); + sum_price += DataUtil.getDefaultByRecord(record, "total_price"); + + row = sheet.createRow(i + 3); + a = 0; + row.createCell(a++).setCellValue(record.getStr("sn")); + row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(record.getDate("arrive_time"))); + row.createCell(a++).setCellValue(record.getStr("supermarket_name")); + row.createCell(a++).setCellValue(record.getStr("truck_license")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(record, "weight")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(record, "total_price")); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + a = 0; + row.createCell(a++).setCellValue("合计"); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(sum_weight); + row.createCell(a++).setCellValue(sum_price); + // 合计 end + + // 设置列宽 + sheet.setColumnWidth(0, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((20.5 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((8 + 0.71) * 256)); + sheet.setColumnWidth(4, (int) ((10 + 0.71) * 256)); + sheet.setColumnWidth(5, (int) ((6 + 0.71) * 256)); + + // 设置通用单元格格式 + for (int r = 2; r < datalen + 4; r++) { + row = sheet.getRow(r); + if (row == null) { + row = sheet.createRow(r); + } + + for (int c = 0; c < end_col + 1; c++) { + cell = row.getCell(c); + + if (cell == null) { + cell = row.createCell(c); + } + cell.setCellStyle(cellStyle); + } + } + + font = wb.createFont(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(datalen + 4); + row.setHeight((short) (28 * 20)); + cell = row.createCell(0); + cell.setCellValue("统计人签名:"); + cell.setCellStyle(cellStyle); + cell = row.createCell(3); + cell.setCellValue("复核人签名:"); + cell.setCellStyle(cellStyle); + + sheet.addMergedRegion(new CellRangeAddress(datalen + 4, datalen + 4, 0, 1));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + + // 每页打印表头 + sheet.setRepeatingRows(new CellRangeAddress(0, 2, -1, -1));//前两位数是设置需要重复打印的行的范围,后两位设置重复打印的列的范围。-1代表不重复打印。用于表头表头换页重复打印 + + wb.setPrintArea( + 0, //sheet index + 0, //start column + end_col, //end column + 0, //start row + sheet.getLastRowNum() //end row + ); + + return wb; + } + + /** + * 客户流水 + * + * @return + */ + public List flow(Integer customer_id, String stm, String etm) { + String sql = "select * from ( \n" + + " select a.sn id, p.arrive_time tm, 0 - a.total_price amount, '扣费' type, \n" + + " case when a.paid > 0 then concat('补差额', a.paid) else '' end memo, a.customer_id, a.customer_name \n" + + " from ( \n" + + " select t.sn, t.total_price, t.paid, t.customer_id, t.customer_name \n" + + " from order_sale t \n" + + " where t.isprepaid = 1 \n" + + " and t.state = ? \n" + + " and t.prepay_customer_id is not null\n" + + " and t.create_time >= ? \n" + + " and t.create_time <= ? \n" + + " union \n" + + " select t.sn, t.total_price, t.paid, t.customer_id, t.customer_name\n" + + " from order_temp t \n" + + " where t.isprepaid = 1 \n" + + " and t.state = ? \n" + + " and t.prepay_customer_id is not null\n" + + " and t.create_time >= ? \n" + + " and t.create_time <= ? \n" + + " ) a \n" + + " left join transport p on p.order_sn = a.sn \n" + + " union \n" + + " select concat('prepay_detail_', t.id) id, t.verify_time tm, t.amount, '付费' type, '' memo, c.id customer_id, c.name customer_name \n" + + " from prepay_detail t \n" + + " left join customer c on c.id = t.customer_id \n" + + " where t.state = 2 \n" + + " and t.verify_time >= ? \n" + + " and t.verify_time <= ? \n" + + " \n" + + " union \n" + + " select concat('refund_detail_', t.id) id, t.verify_time tm, 0 - t.amount amount, '退费' type, '' memo, c.id customer_id, c.name customer_name \n" + + " from refund_detail t \n" + + " left join customer c on c.id = t.customer_id \n" + + " where t.state = 3 \n" + // 退费有三个状态 + " and t.verify_time >= ? \n" + + " and t.verify_time <= ? \n" + + " ) b \n" + + " where 1=1 "; + + List paraList = new ArrayList<>(); + + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + paraList.add(stm); + paraList.add(etm); + + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + paraList.add(stm); + paraList.add(etm); + + paraList.add(stm); + paraList.add(etm); + + paraList.add(stm); + paraList.add(etm); + + if (customer_id != null && customer_id > 0) { + sql += " and b.customer_id = ? \n"; + paraList.add(customer_id); + } + + sql += " order by b.tm desc"; + + return Db.find(sql, paraList.toArray()); + } + + public Workbook flowExport(Integer customer_id, String stm, String etm) { + Customer customer = Customer.dao.findById(customer_id); + String cname = ""; + + if (customer != null) { + cname = customer.getName(); + } + + List list = flow(customer_id, stm, etm); + + list.sort(new Comparator() { + public int compare(Record o1, Record o2) { + long d1 = o1.getDate("tm").getTime(); + long d2 = o2.getDate("tm").getTime(); + + if (d1 > d2) { + return 1; + } else if (d1 == d2) { + return 0; + } + + return -1; + } + }); + + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(cname + " 流水"); + + // 标题 start + Font font = wb.createFont(); + font.setBold(true); + font.setFontHeight((short) (18 * 20)); + font.setFontName("宋体"); + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); + cell.setCellValue(CacheData.print_vendor); + row.setHeight((short) (40 * 20)); // POI中的行高单位是twips(缇) ,Office Excel行高单位是pt(磅) 设置的行高,单位为1/20pt + cell.setCellStyle(cellStyle); + // 标题 end + + // 副标题 start + String subtitle = cname; + try { + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdfhms.get().parse(stm)) + " ~ " + DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdfhms.get().parse(etm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += "资金流水"; + font = wb.createFont(); + font.setFontHeight((short) (12 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(1); + row.setHeight((short) (28 * 20)); + cell = row.createCell(0); + cell.setCellValue(subtitle); + cell.setCellStyle(cellStyle); + // 副标题 end + + // 设置表头 + // 表头 start + font = wb.createFont(); + cellStyle = wb.createCellStyle(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + cellStyle.setFont(font); + + row = sheet.createRow(2); + int a = 0; + row.createCell(a++).setCellValue("时间"); + row.createCell(a++).setCellValue("操作"); + row.createCell(a++).setCellValue("金额"); + row.createCell(a++).setCellValue("备注"); + // 表头 end + + int end_col = 3; + int datalen = list.size(); + double sum_price = 0.0; + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + + sum_price += DataUtil.getDefaultByRecord(record, "amount"); + + row = sheet.createRow(i + 3); + a = 0; + row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(record.getDate("tm"))); + row.createCell(a++).setCellValue(record.getStr("type")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(record, "amount")); + row.createCell(a++).setCellValue(record.getStr("memo")); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + a = 0; + row.createCell(a++).setCellValue("合计"); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(sum_price); + // 合计 end + + // 设置列宽 + sheet.setColumnWidth(0, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((20 + 0.71) * 256)); + + // 设置通用单元格格式 + for (int r = 2; r < datalen + 4; r++) { + row = sheet.getRow(r); + if (row == null) { + row = sheet.createRow(r); + } + + for (int c = 0; c < end_col + 1; c++) { + cell = row.getCell(c); + + if (cell == null) { + cell = row.createCell(c); + } + cell.setCellStyle(cellStyle); + } + } + + font = wb.createFont(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(datalen + 4); + row.setHeight((short) (28 * 20)); + cell = row.createCell(0); + cell.setCellValue("统计人签名:"); + cell.setCellStyle(cellStyle); + cell = row.createCell(2); + cell.setCellValue("复核人签名:"); + cell.setCellStyle(cellStyle); + + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + + // 每页打印表头 + sheet.setRepeatingRows(new CellRangeAddress(0, 2, -1, -1));//前两位数是设置需要重复打印的行的范围,后两位设置重复打印的列的范围。-1代表不重复打印。用于表头表头换页重复打印 + + wb.setPrintArea( + 0, //sheet index + 0, //start column + end_col, //end column + 0, //start row + sheet.getLastRowNum() //end row + ); + + return wb; + } + + // TODO: 客户流水 和 预付费车辆记录 这两个功能,对应的数据,都应该是该用户第一次预付费记录之后的订单记录 +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaycustomer/PrepayCustomerService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaycustomer/PrepayCustomerService.java new file mode 100644 index 0000000..5ba49c2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaycustomer/PrepayCustomerService.java @@ -0,0 +1,11 @@ +package com.cowr.ssjygl.prepay.prepaycustomer; + +import com.cowr.model.PrepayCustomer; + +public class PrepayCustomerService { + public static PrepayCustomerService me = new PrepayCustomerService(); + + public PrepayCustomer getPrepayCustomer(int customer_id, int supermarket_id){ + return PrepayCustomer.dao.findFirst("select * from prepay_customer where customer_id = ? and supermarket_id = ? ", customer_id, supermarket_id); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailPKValidator.java new file mode 100644 index 0000000..f4f3353 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailPKValidator.java @@ -0,0 +1,23 @@ +package com.cowr.ssjygl.prepay.prepaydetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class PrepayDetailPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailService.java new file mode 100644 index 0000000..cfc152f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailService.java @@ -0,0 +1,281 @@ +package com.cowr.ssjygl.prepay.prepaydetail; + +import com.cowr.ssjygl.CacheData; +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.utils.DataUtil; +import com.cowr.common.view.PageParam; +import com.cowr.model.Customer; +import com.cowr.model.PrepayDetail; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class PrepayDetailService extends BaseService { + private static Log log = Log.getLog(PrepayDetailService.class); + public static final PrepayDetailService me = new PrepayDetailService(); + private static final ThreadLocal sdfhms = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + private static final ThreadLocal sdfymd = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy年MM月dd日"); + } + }; + + public Page find(PageParam pp, String name, String stm, String etm, Integer state) { + String selectsql = "select t.*, c.name customer_name, c.address, c.texpayer_name, c.texpayer_num, c.memo, p.surplus"; + String fromsql = " from prepay_detail t \n" + + " left join customer c on t.customer_id = c.id" + + " left join prepay_customer p on t.customer_id = p.customer_id" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(name)) { + fromsql += " and c.name like ? \n"; + paraList.add("%" + name + "%"); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ?"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ?"; + paraList.add(etm); + } + + if (state != null) { + fromsql += " and t.state = ?"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && PrepayDetail.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.create_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list(Integer customer_id, String stm, String etm) { + if(customer_id != null){ + return Db.find("select t.*, c.name customer_name from prepay_detail t \n" + + " left join customer c on c.id = t.customer_id" + + " where t.state = 2 \n" + + " and t.customer_id = ? \n" + + " and t.verify_time >= ? \n" + + " and t.verify_time <= ? ", customer_id, stm, etm); + }else{ + return Db.find("select t.*, c.name customer_name from prepay_detail t \n" + + " left join customer c on c.id = t.customer_id" + + " where t.state = 2 \n" + + " and t.verify_time >= ? \n" + + " and t.verify_time <= ? ", stm, etm); + } + } + + public Workbook listExport(Integer customer_id, String stm, String etm) { + Customer customer = Customer.dao.findById(customer_id); + String cname = ""; + + if (customer != null) { + cname = customer.getName(); + } + + List list = list(customer_id, stm, etm); + + list.sort(new Comparator() { + public int compare(Record o1, Record o2) { + long d1 = o1.getDate("verify_time").getTime(); + long d2 = o2.getDate("verify_time").getTime(); + + if (d1 > d2) { + return 1; + } else if (d1 == d2) { + return 0; + } + + return -1; + } + }); + + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(cname + " 付费详细"); + + // 标题 start + Font font = wb.createFont(); + font.setBold(true); + font.setFontHeight((short) (18 * 20)); + font.setFontName("宋体"); + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); + cell.setCellValue(CacheData.print_vendor); + row.setHeight((short) (40 * 20)); // POI中的行高单位是twips(缇) ,Office Excel行高单位是pt(磅) 设置的行高,单位为1/20pt + cell.setCellStyle(cellStyle); + // 标题 end + + // 副标题 start + String subtitle = cname; + try { + subtitle += sdfymd.get().format(sdfhms.get().parse(stm)) + " ~ " + sdfymd.get().format(sdfhms.get().parse(etm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += "付费详细"; + font = wb.createFont(); + font.setFontHeight((short) (12 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(1); + row.setHeight((short) (28 * 20)); + cell = row.createCell(0); + cell.setCellValue(subtitle); + cell.setCellStyle(cellStyle); + // 副标题 end + + // 设置表头 + // 表头 start + font = wb.createFont(); + cellStyle = wb.createCellStyle(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + cellStyle.setFont(font); + + row = sheet.createRow(2); + int a = 0; + row.createCell(a++).setCellValue("时间"); + row.createCell(a++).setCellValue("转账银行"); + row.createCell(a++).setCellValue("转账流水号"); + row.createCell(a++).setCellValue("金额"); + // 表头 end + + int end_col = 3; + int datalen = list.size(); + double sum_price = 0.0; + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + + sum_price += DataUtil.getDefaultByRecord(record, "amount"); + + row = sheet.createRow(i + 3); + a = 0; + row.createCell(a++).setCellValue(sdfhms.get().format(record.getDate("verify_time"))); + row.createCell(a++).setCellValue(record.getStr("bank_name")); + row.createCell(a++).setCellValue(record.getStr("serialnum")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(record, "amount")); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + a = 0; + row.createCell(a++).setCellValue("合计"); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(sum_price); + // 合计 end + + // 设置列宽 + sheet.setColumnWidth(0, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((20 + 0.71) * 256)); + + // 设置通用单元格格式 + for (int r = 2; r < datalen + 4; r++) { + row = sheet.getRow(r); + if (row == null) { + row = sheet.createRow(r); + } + + for (int c = 0; c < end_col + 1; c++) { + cell = row.getCell(c); + + if (cell == null) { + cell = row.createCell(c); + } + cell.setCellStyle(cellStyle); + } + } + + font = wb.createFont(); + font.setFontHeight((short) (10 * 20)); + font.setFontName("宋体"); + cellStyle = wb.createCellStyle(); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 + + row = sheet.createRow(datalen + 4); + row.setHeight((short) (28 * 20)); + cell = row.createCell(0); + cell.setCellValue("统计人签名:"); + cell.setCellStyle(cellStyle); + cell = row.createCell(2); + cell.setCellValue("复核人签名:"); + cell.setCellStyle(cellStyle); + + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, end_col));// 下标从0开始 起始行号,终止行号, 起始列号,终止列号 + + // 每页打印表头 + sheet.setRepeatingRows(new CellRangeAddress(0, 2, -1, -1));//前两位数是设置需要重复打印的行的范围,后两位设置重复打印的列的范围。-1代表不重复打印。用于表头表头换页重复打印 + + wb.setPrintArea( + 0, //sheet index + 0, //start column + end_col, //end column + 0, //start row + sheet.getLastRowNum() //end row + ); + + return wb; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailValidator.java new file mode 100644 index 0000000..fe3b30e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailValidator.java @@ -0,0 +1,43 @@ +package com.cowr.ssjygl.prepay.prepaydetail; + +import com.cowr.common.utils.StrUtil; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.PrepayDetail; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class PrepayDetailValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + } + + validateInteger("customer_id", 1, 2147483647, "customer_id", "customer_id 范围 1~2147483647"); + validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647"); + validateBigDecimal("amount", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "amount", "amount 范围 0~9.9999999999E10"); + validateString("contact_name", 1, 100, "contact_name", "contact_name 长度 1~100"); + validateRegex("contact_phone", StrUtil.regphone, "contact_phone", "contact_phone 必须为手机号格式"); + validateString("bank_name", 1, 128, "bank_name", "bank_name 长度 1~128"); + validateString("bank_account", 0, 128, "bank_account", "bank_account 长度 0~128"); + validateString("serialnum", 1, 128, "serialnum", "serialnum 长度 1~128"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java new file mode 100644 index 0000000..f323450 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java @@ -0,0 +1,32 @@ +package com.cowr.ssjygl.prepay.prepaydetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class PrepayDetailVerifyValidator extends CrudParamValidator { + private static List chkstate = new ArrayList(){{ + add(2); + add(9); + }}; + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + validateInIntegerArray("state", chkstate, "state", "state 可选值 2、9"); + validateString("memo", 0, 255, "memo", "memo 长度 0~255"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/DayValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/DayValidator.java new file mode 100644 index 0000000..178f3c1 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/DayValidator.java @@ -0,0 +1,22 @@ +package com.cowr.ssjygl.prepay.prepaytruck; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; + +/** + * Generated by COWR Thu Jun 27 17:01:16 CST 2019 + */ +public class DayValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + if(StrKit.notBlank(c.get("valid_date"))){ + validateDate("valid_date", "yyyy-MM-dd","valid_date","valid_date 格式必须为 yyyy-MM-dd"); + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckPKValidator.java new file mode 100644 index 0000000..66d3168 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckPKValidator.java @@ -0,0 +1,24 @@ +package com.cowr.ssjygl.prepay.prepaytruck; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Feb 23 21:22:13 CST 2020 + * TableName: prepay_truck + * Remarks: 每日超市指定预付费车辆 + * PrimaryKey: id + */ +public class PrepayTruckPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckService.java new file mode 100644 index 0000000..bb7b368 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckService.java @@ -0,0 +1,263 @@ +package com.cowr.ssjygl.prepay.prepaytruck; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.utils.DataUtil; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.PrepayTruck; +import com.cowr.model.Sysuser; +import com.cowr.model.Truck; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Generated by COWR Sun Feb 23 21:36:39 CST 2020 + * TableName: prepay_truck + * Remarks: 每日超市指定预付费车辆 + * PrimaryKey: id + */ +public class PrepayTruckService extends BaseService { + private static Log log = Log.getLog(PrepayTruckService.class); + private static final ThreadLocal sdfday = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd"); + } + }; + public static final PrepayTruckService me = new PrepayTruckService(); + + public Result save(PrepayTruck model, Sysuser sysuser) { + try { + String[] tls = model.getTruckLicense().split(","); + List list = Truck.dao.find("select t.license, t.trans_co_id from truck t where t.del = 0"); // 只返回需要的字段 + Map map = new HashMap<>(); + for(Truck t : list){ + map.put(t.getLicense(), t.getTransCoId()); + } + + if(model.getValidDate() == null){ + model.setValidDate(new Date()); + } + + model.setCreateUserId(sysuser.getId()); + + List pts = new ArrayList<>(); + model.remove("truck_license"); + + for(String truck_license: tls){ + Record record = DataUtil.cloneRecord(model.toRecord()); + record.set("truck_license", truck_license); + record.set("trans_co_id", map.get(truck_license)); + + pts.add(record); + } + + if(pts.isEmpty()){ + return Result.failed("truck_license 参数错误"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + int[] ret = Db.batchSave(PrepayTruck.tablename, pts, pts.size()); + + return ret.length == pts.size(); + } + }); + + return ret ? Result.success() : Result.failed(false, "新增失败"); + } catch (Exception e) { + if(e.getMessage().contains("prepay_truck_license_customer")){ + return Result.failed("同一辆车同一天只能分配给一个客户"); + } + + log.error(e.getMessage(), e); + return Result.failed(false, e.getMessage()); + } + } + + /** + * 删除 + * + * @param model PrepayTruck + * @return Result + */ + public Result delete(PrepayTruck model) { + try { + // 如果存在逻辑删除字段 del,则只做逻辑删除,不做物理删除 + if (model.hasDelKey()) { + return logicDel(model); + } + + PrepayTruck old = model.findByPk(); + + if(old == null){ + return Result.failed(false, "按主键未找到对应记录"); + }else{ + Date oldtm = old.getValidDate(); + Calendar c = Calendar.getInstance(); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + + if(oldtm.before(c.getTime())){ + return Result.failed(false, "当前日期之前的记录不能解绑"); + } + } + + return Result.object(model.delete()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + public Page find(PageParam pp, Integer customer_id, Integer supermarket_id, Integer trans_co_id, String truck_license, String valid_date) { + String selectsql = "select t.id, t.customer_id, c.name customer_name, t.truck_license, " + + " co.name trans_co_name, t.supermarket_id, s.name supermarket_name, t.valid_date, t.create_user_id, u.name create_user_name\n"; + String fromsql = " from prepay_truck t \n" + + " left join truck tr on tr.license = t.truck_license \n" + + " left join transport_company co on co.id = tr.trans_co_id" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join sysuser u on u.id = t.create_user_id \n" + + " left join customer c on c.id = t.customer_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (trans_co_id != null) { + fromsql += " and t.trans_co_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(valid_date)) { + fromsql += " and t.valid_date = ? \n"; + paraList.add(valid_date); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && PrepayTruck.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.valid_date desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list(Integer customer_id, Integer supermarket_id, Integer trans_co_id, String truck_license, String valid_date) { + String selectsql = "select t.id, t.customer_id, c.name customer_name, t.truck_license, " + + " co.name trans_co_name, t.supermarket_id, s.name supermarket_name, t.valid_date, t.create_user_id, u.name create_user_name\n"; + String fromsql = " from prepay_truck t \n" + + " left join transport_company co on co.id = t.trans_co_id \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join sysuser s on u.id = t.create_user_id \n" + + " left join customer c on c.id = t.customer_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (customer_id != null) { + fromsql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (trans_co_id != null) { + fromsql += " and t.trans_co_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(valid_date)) { + fromsql += " and t.valid_date = ? \n"; + paraList.add(valid_date); + } + + String findSql = selectsql + fromsql; + + return Db.find(findSql, paraList.toArray()); + } + + /** + * 车牌号当日是否可以进对应的超市进行预付费业务 + * @param supermarket_id + * @param truck_license + * @return + */ + public PrepayTruck checkTruckLicense(int supermarket_id, String truck_license) { + if (StrKit.isBlank(truck_license)) { + return null; + } + + return PrepayTruck.dao.findFirst("select * from prepay_truck t \n" + + " where t.supermarket_id = ? \n" + + " and t.valid_date = ?" + + " and truck_license like ? \n" + + " limit 0,1", + supermarket_id, + sdfday.get().format(new Date()), + "%" + truck_license.substring(1)); + } + + /** + * 从预付费车辆中直接查询当天车牌对象 + * 用完整的车牌查 + * @param supermarket_id + * @param truck_license + * @return + */ + public Record checkValidLicense(int supermarket_id, String truck_license) { + if (StrKit.isBlank(truck_license)) { + return null; + } + + return Db.findFirst("select t.truck_license license, t.trans_co_id from prepay_truck t \n" + + " where t.supermarket_id = ? \n" + + " and t.valid_date = ? \n" + + " and t.truck_license = ? \n" + + " limit 0,1", + supermarket_id, + sdfday.get().format(new Date()), + truck_license); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java new file mode 100644 index 0000000..5821012 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java @@ -0,0 +1,38 @@ +package com.cowr.ssjygl.prepay.prepaytruck; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.PrepayTruck; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; + +/** + * Generated by COWR Sun Feb 23 21:22:13 CST 2020 + * TableName: prepay_truck + * Remarks: 每日超市指定预付费车辆 + * PrimaryKey: id + */ +public class PrepayTruckValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateRequired("trucks", "trucks", "trucks 必填"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java new file mode 100644 index 0000000..7797452 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java @@ -0,0 +1,32 @@ +package com.cowr.ssjygl.prepay.refunddetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class RefundDetailConfirmValidator extends CrudParamValidator { + private static List chkstate = new ArrayList(){{ + add(2); + add(9); + }}; + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + validateBigDecimal("amount", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "amount", "amount 范围 -9.9999999999E10~9.9999999999E10"); + validateString("serialnum", 1, 128, "serialnum", "serialnum 长度 0~128"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailPKValidator.java new file mode 100644 index 0000000..b3b27a2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailPKValidator.java @@ -0,0 +1,23 @@ +package com.cowr.ssjygl.prepay.refunddetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: refund_detail + * Remarks: 预付费客户退费详情 + * PrimaryKey: id + */ +public class RefundDetailPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailService.java new file mode 100644 index 0000000..2915d42 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailService.java @@ -0,0 +1,76 @@ +package com.cowr.ssjygl.prepay.refunddetail; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.RefundDetail; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: refund_detail + * Remarks: 预付费客户退费详情 + * PrimaryKey: id + */ +public class RefundDetailService extends BaseService { + private static Log log = Log.getLog(RefundDetailService.class); + public static final RefundDetailService me = new RefundDetailService(); + + public Page find(PageParam pp, String name, String stm, String etm, Integer state) { + String selectsql = "select t.*, c.name customer_name, c.address, c.texpayer_name, c.texpayer_num, c.memo, p.surplus"; + String fromsql = " from refund_detail t \n" + + " left join customer c on t.customer_id = c.id" + + " left join prepay_customer p on t.customer_id = p.customer_id" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(name)) { + fromsql += " and c.name like ? \n"; + paraList.add("%" + name + "%"); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.create_time >= ?"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.create_time <= ?"; + paraList.add(etm); + } + + if (state != null) { + fromsql += " and t.state = ?"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && RefundDetail.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } else { + findSql += " order by t.change_time desc"; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return RefundDetail.dao.find("select * from refund_detail"); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailValidator.java new file mode 100644 index 0000000..9359a1e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailValidator.java @@ -0,0 +1,43 @@ +package com.cowr.ssjygl.prepay.refunddetail; + +import com.cowr.common.utils.StrUtil; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.RefundDetail; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: refund_detail + * Remarks: 预付费客户退费详情 + * PrimaryKey: id + */ +public class RefundDetailValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + } + + validateInteger("customer_id", 1, 2147483647, "customer_id", "customer_id 范围 1~2147483647"); + validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647"); + validateBigDecimal("amount", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "amount", "amount 范围 -9.9999999999E10~9.9999999999E10"); + validateString("contact_name", 1, 100, "contact_name", "contact_name 长度 1~100"); + validateRegex("contact_phone", StrUtil.regphone, "contact_phone", "contact_phone 必须为手机号格式"); + validateString("bank_name", 1, 128, "bank_name", "bank_name 长度 1~128"); + validateString("bank_account", 1, 128, "bank_account", "bank_account 长度 1~128"); + validateString("serialnum", 0, 128, "serialnum", "serialnum 长度 0~128"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java new file mode 100644 index 0000000..f97227c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java @@ -0,0 +1,32 @@ +package com.cowr.ssjygl.prepay.refunddetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class RefundDetailVerifyValidator extends CrudParamValidator { + private static List chkstate = new ArrayList(){{ + add(2); + add(9); + }}; + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + validateInIntegerArray("state", chkstate, "state", "state 可选值 2、9"); + validateString("memo", 0, 255, "memo", "memo 长度 0~255"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductPKValidator.java new file mode 100644 index 0000000..a63fa51 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductPKValidator.java @@ -0,0 +1,24 @@ +package com.cowr.ssjygl.product; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: product + * Remarks: 商品信息 + * PrimaryKey: id + */ +public class ProductPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductService.java new file mode 100644 index 0000000..ae35667 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductService.java @@ -0,0 +1,62 @@ +package com.cowr.ssjygl.product; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Product; +import com.cowr.model.Sysuser; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: product + * Remarks: 商品信息 + * PrimaryKey: id + */ +public class ProductService extends BaseService { + public static final ProductService me = new ProductService(); + + public Page find(PageParam pp, String name, Integer del) { + String selectsql = "select * "; + String fromsql = "from product t where 1=1 \n"; + List paraList = new ArrayList<>(); + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + if (StrKit.notBlank(name)) { + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Product.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return Product.dao.find("select * from product t where t.del = 0 "); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductValidator.java new file mode 100644 index 0000000..3bb93d2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/product/ProductValidator.java @@ -0,0 +1,36 @@ +package com.cowr.ssjygl.product; + +import com.jfinal.core.Controller; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Product; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: product + * Remarks: 商品信息 + * PrimaryKey: id + */ +public class ProductValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateString("name", 1, 255, "name", "name 长度 1~255"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Product.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchasePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchasePKValidator.java new file mode 100644 index 0000000..e098bc9 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchasePKValidator.java @@ -0,0 +1,24 @@ +package com.cowr.ssjygl.purchase; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: purchase + * Remarks: 采购点(采砂场) + * PrimaryKey: id + */ +public class PurchasePKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseService.java new file mode 100644 index 0000000..52f3b1b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseService.java @@ -0,0 +1,59 @@ +package com.cowr.ssjygl.purchase; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Purchase; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: purchase + * Remarks: 采购点(采砂场) + * PrimaryKey: id + */ +public class PurchaseService extends BaseService { + public static final PurchaseService me = new PurchaseService(); + + public Page find(PageParam pp, String name, Integer del) { + String selectsql = "select * "; + String fromsql = "from purchase t where 1=1 \n"; + List paraList = new ArrayList<>(); + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + if (StrKit.notBlank(name)) { + fromsql += " and t.name like ?"; + paraList.add("%" + name + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Purchase.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return Purchase.dao.find("select * from purchase t where t.del = 0 "); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseValidator.java new file mode 100644 index 0000000..9fd1812 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/purchase/PurchaseValidator.java @@ -0,0 +1,43 @@ +package com.cowr.ssjygl.purchase; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Purchase; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: purchase + * Remarks: 采购点(采砂场) + * PrimaryKey: id + */ +public class PurchaseValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateString("name", 1, 255, "name", "name 长度 1~255"); + validateBigDecimal("lgtd", new java.math.BigDecimal(74), new java.math.BigDecimal(135), "lgtd", "lgtd 范围 74~135"); + validateBigDecimal("lttd", new java.math.BigDecimal(3.75), new java.math.BigDecimal(53.7), "lttd", "lttd 范围 3.75~53.7"); + validateString("address", 1, 255, "address", "address 长度 1~255"); + validateString("contact_name", 0, 255, "contact_name", "contact_name 长度 0~255"); + validateString("contact_phone", 0, 11, "contact_phone", "contact_phone 长度 0~11"); + validateString("memo", 0, 255, "memo", "memo 长度 0~255"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Purchase.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmPKValidator.java new file mode 100644 index 0000000..9e9c7ef --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.sandfarm; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Sandfarm; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: sandfarm + * Remarks: 生产点(采砂场) + * PrimaryKey: id + */ +public class SandfarmPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmService.java new file mode 100644 index 0000000..a0baabb --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmService.java @@ -0,0 +1,59 @@ +package com.cowr.ssjygl.sandfarm; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Sandfarm; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: sandfarm + * Remarks: 生产点(采砂场) + * PrimaryKey: id + */ +public class SandfarmService extends BaseService { + public static final SandfarmService me = new SandfarmService(); + + public Page find(PageParam pp, String name, Integer del) { + String selectsql = "select * "; + String fromsql = "from sandfarm t where 1=1 \n"; + List paraList = new ArrayList<>(); + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + if (StrKit.notBlank(name)) { + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Sandfarm.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return Sandfarm.dao.find("select * from sandfarm t where t.del = 0 "); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmValidator.java new file mode 100644 index 0000000..cb67f26 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/sandfarm/SandfarmValidator.java @@ -0,0 +1,43 @@ +package com.cowr.ssjygl.sandfarm; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Sandfarm; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: sandfarm + * Remarks: 生产点(采砂场) + * PrimaryKey: id + */ +public class SandfarmValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateString("name", 1, 255, "name", "name 长度 1~255"); + validateBigDecimal("lgtd", new java.math.BigDecimal(74), new java.math.BigDecimal(135), "lgtd", "lgtd 范围 74~135"); + validateBigDecimal("lttd", new java.math.BigDecimal(3.75), new java.math.BigDecimal(53.7), "lttd", "lttd 范围 3.75~53.7"); + validateString("address", 1, 255, "address", "address 长度 1~255"); + validateString("contact_name", 0, 255, "contact_name", "contact_name 长度 0~255"); + validateString("contact_phone", 0, 11, "contact_phone", "contact_phone 长度 0~11"); + validateString("memo", 0, 255, "memo", "memo 长度 0~255"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatController.java new file mode 100644 index 0000000..3a27bed --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatController.java @@ -0,0 +1,33 @@ +package com.cowr.ssjygl.stat.purchase; + +import com.cowr.common.base.BaseController; +import com.cowr.common.validator.DayValidator; +import com.cowr.common.view.ExcelRender; +import com.cowr.common.view.Result; +import com.jfinal.aop.Before; +import org.apache.poi.ss.usermodel.Workbook; + +public class OrderPurchaseStatController extends BaseController { + + /** + * 采购明细 + */ + @Before(DayValidator.class) + public void detail() { + String sn = get("sn"); + String truck_license = getUpperCaseVal("truck_license"); + String tm = get("tm"); + Integer supermarket_id = getInt("supermarket_id"); + Integer purchase_id = getInt("purchase_id"); + Integer trans_co_id = getInt("trans_co_id"); + Integer product_id = getInt("product_id"); + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + + if (export == 0) { + renderJson(Result.object(OrderPurchaseStatService.me.detail(sn, tm, supermarket_id, purchase_id, trans_co_id, truck_license, product_id))); + } else { + Workbook wb = OrderPurchaseStatService.me.detailExport(sn, tm, supermarket_id, purchase_id, trans_co_id, truck_license, product_id); + render(new ExcelRender(tm + "_采购明细_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatService.java new file mode 100644 index 0000000..f309657 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/purchase/OrderPurchaseStatService.java @@ -0,0 +1,250 @@ +package com.cowr.ssjygl.stat.purchase; + +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.utils.DataUtil; +import com.cowr.common.utils.DateTimeUtil; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.ReportExcelStyle; +import com.cowr.model.Supermarket; +import com.cowr.ssjygl.CacheData; +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.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class OrderPurchaseStatService { + public static OrderPurchaseStatService me = new OrderPurchaseStatService(); + private static Log log = Log.getLog(OrderPurchaseStatService.class); + + public List detail( + String sn, + String tm, + Integer supermarket_id, + Integer purchase_id, + Integer trans_co_id, + String truck_license, + Integer product_id + ) { + String sql = "select t.* " + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name, f.name purchase_name \n" + + " from order_purchase t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join purchase f on f.id = t.purchase_id \n" + + " where t.state = ? \n"; + List paraList = new ArrayList<>(); + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + + if (StrKit.notBlank(sn)) { + sql += " and t.sn like ? \n"; + paraList.add("%" + sn + "%"); + } + + if (supermarket_id != null) { + sql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (purchase_id != null) { + sql += " and t.purchase_id = ? \n"; + paraList.add(purchase_id); + } + + if (trans_co_id != null) { + sql += " and t.trans_co_id = ? \n"; + paraList.add(trans_co_id); + } + + if (product_id != null) { + sql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + if (StrKit.notBlank(truck_license)) { + sql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(tm)) { + sql += " and t.create_time like ? \n"; + paraList.add(tm + "%"); + } + + return Db.find(sql, paraList.toArray()); + } + + + /** + * 导出转运详细报表 + * + * @param tm + * @param supermarket_id + * @param purchase_id + * @return + */ + public Workbook detailExport( + String sn, + String tm, + Integer supermarket_id, + Integer purchase_id, + Integer trans_co_id, + String truck_license, + Integer product_id + ) { + List list = detail(sn, tm, supermarket_id, purchase_id, trans_co_id, truck_license, product_id); + + list.sort(new Comparator() { + public int compare(Record o1, Record o2) { + long d1 = o1.getDate("create_time").getTime(); + long d2 = o2.getDate("create_time").getTime(); + + if (d1 > d2) { + return 1; + } else if (d1 == d2) { + return 0; + } + + return -1; + } + }); + + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet("转运详细报表"); + + // 副标题 start + String subtitle = ""; + String sup_name = null; + + if (supermarket_id != null && supermarket_id > 0) { + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket != null) { + subtitle += supermarket.getName(); + sup_name = supermarket.getName(); + } + } + + try { + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdf.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + subtitle += "采购汇总表"; + + + // 表头 start + Row row = sheet.createRow(2); + int a = 0; + + row.createCell(a++).setCellValue("序号"); + row.createCell(a++).setCellValue("入场时间"); + row.createCell(a++).setCellValue("采购单编号"); + row.createCell(a++).setCellValue("采购砂场"); + // 筛选添加了超市时,列表中不显示超市 + if (sup_name == null) { + 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 + + double sum_weight = 0.0; + double sum_distance = 0.0; + double sum_trans_price = 0.0; + int datalen = list.size(); + int end_col = sup_name == null ? 12 : 11; + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + Double weigth = record.getDouble("weight"); + a = 0; + + sum_weight += weigth; + sum_distance += DataUtil.getDefaultByRecord(record, "trans_distance"); + sum_trans_price += DataUtil.getDefaultByRecord(record, "trans_price"); + + row = sheet.createRow(i + 3); + row.createCell(a++).setCellValue(i + 1); + row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(record.getDate("in_time"))); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "sn")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "purchase_name")); + + // 筛选添加了超市时,列表中不显示超市 + if (sup_name == null) { + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "supermarket_name")); + } + + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "trans_co_name")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "truck_license")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "trans_distance")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "first_weight")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "second_weight")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "weight")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "source_weight")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "trans_price")); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + 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(sum_distance); + row.createCell(a++).setCellValue(sum_weight); + row.createCell(a++).setCellValue(sum_trans_price); + // 合计 end + + sheet.setColumnWidth(0, (int) ((4.13 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((10.75 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(4, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(5, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(6, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(7, (int) ((10.75 + 0.71) * 256)); + sheet.setColumnWidth(8, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(9, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(10, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(11, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(12, (int) ((16.13 + 0.71) * 256)); + sheet.setColumnWidth(13, (int) ((16.13 + 0.71) * 256)); + sheet.setColumnWidth(14, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(15, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(16, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(17, (int) ((12.5 + 0.71) * 256)); + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col); + + return wb; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatController.java new file mode 100644 index 0000000..ebd0799 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatController.java @@ -0,0 +1,276 @@ +package com.cowr.ssjygl.stat.sale; + +import com.cowr.common.base.BaseController; +import com.cowr.common.validator.DayValidator; +import com.cowr.common.validator.MonthValidator; +import com.cowr.common.validator.StartAndEndintervalValidator; +import com.cowr.common.view.ExcelRender; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.supermarket.SupermarketIdValidator; +import com.jfinal.aop.Before; +import org.apache.poi.ss.usermodel.Workbook; + +public class OrderStatController extends BaseController { + + /** + * 日销售明细 + */ + @Before(DayValidator.class) + public void daydetail() { + String tm = get("tm"); + String customer_name = get("customer_name"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer supermarket_id = getInt("supermarket_id"); + Integer trans_co_id = getInt("trans_co_id"); + Integer customer_id = getInt("customer_id"); + Integer type = getInt("type"); + Integer isprepaid = getInt("isprepaid"); + Integer product_id = getInt("product_id"); + + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.daydetail( + tm, + supermarket_id, + trans_co_id, + customer_id, + customer_name, + type, + truck_license, + isprepaid, + product_id, + sn + ))); + } else { + Workbook wb = OrderStatService.me.daydetailExport( + tm, + supermarket_id, + trans_co_id, + customer_id, + customer_name, + type, + truck_license, + isprepaid, + product_id, + sn + ); + render(new ExcelRender(tm + "_日销售明细_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 销售月统计,超市/客户的矩阵 + */ + @Before(MonthValidator.class) + public void monthgrid() { + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_id = getInt("customer_id"); + String tm = get("tm"); + int export = getInt("export", 0); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.monthgrid(tm, supermarket_id, customer_id))); + } else { + Workbook wb = OrderStatService.me.monthgridExport(tm, supermarket_id, customer_id); + render(new ExcelRender(tm + "_销售月汇总_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + + /** + * 销售日统计 + */ + @Before(DayValidator.class) + public void daystat() { + String tm = get("tm"); + int export = getInt("export", 0); + if (export == 0) { + renderJson(Result.object(OrderStatService.me.salestat(tm))); + } else { + Workbook wb = OrderStatService.me.daysalestatExport(tm); + render(new ExcelRender(tm + "_销售日统计_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 销售月统计 + */ + @Before(MonthValidator.class) + public void monthstat() { + String tm = get("tm"); + int export = getInt("export", 0); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.salestat(tm))); + } else { + Workbook wb = OrderStatService.me.monthsalestatExport(tm); + render(new ExcelRender(tm + "_销售月统计_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 销售日统计 + */ + @Before(DayValidator.class) + public void daystatCustomer() { + String tm = get("tm"); + int export = getInt("export", 0); + if (export == 0) { + renderJson(Result.object(OrderStatService.me.salestatCustomer(tm))); + } else { + Workbook wb = OrderStatService.me.daysalestatCustomerExport(tm); + render(new ExcelRender(tm + "_销售日统计_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 销售月统计 + */ + @Before(MonthValidator.class) + public void monthstatCustomer() { + String tm = get("tm"); + int export = getInt("export", 0); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.salestatCustomer(tm))); + } else { + Workbook wb = OrderStatService.me.monthsalestatCustomerExport(tm); + render(new ExcelRender(tm + "_销售月统计_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 销售月逐日统计 + */ + @Before(MonthValidator.class) + public void mdstat() { + String tm = get("tm"); + int export = getInt("export", 0); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.mdstat(tm))); + } else { + Workbook wb = OrderStatService.me.mdstatExport(tm); + render(new ExcelRender(tm + "_销售月逐日统计_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 日销售汇总 + */ + @Before(DayValidator.class) + public void statDayTrans() { + String tm = get("tm"); + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + boolean stat_product = getBoolean("stat_product", false); + Integer isprepaid = getInt("isprepaid"); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.statTrans(tm, null, null, supermarket_id, stat_product, product_id, isprepaid))); + } else { + Workbook wb = OrderStatService.me.statTransExport("超市日销售汇总表", tm, null, null, supermarket_id, stat_product, product_id, isprepaid); + render(new ExcelRender(tm + "_超市日" + (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 月销售统计 + */ + @Before(MonthValidator.class) + public void statMonthTrans() { + String tm = get("tm"); + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + boolean stat_product = getBoolean("stat_product", false); + Integer isprepaid = getInt("isprepaid"); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.statTrans(tm, null, null, supermarket_id, stat_product, product_id, isprepaid))); + } else { + Workbook wb = OrderStatService.me.statTransExport("超市月销售汇总表", tm, null, null, supermarket_id, stat_product, product_id, isprepaid); + render(new ExcelRender(tm + "_超市月" + (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + @Before(StartAndEndintervalValidator.class) + public void statRangeTrans() { + String stm = get("stm"); // 前端将 YYYY-MM-DD 后面补 " 00:00:00" + String etm = get("etm"); // 前端将 YYYY-MM-DD 后面补 " 23:59:59" + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + boolean stat_product = getBoolean("stat_product", false); + Integer isprepaid = getInt("isprepaid"); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.statTrans(null, stm, etm, supermarket_id, stat_product, product_id, isprepaid))); + } else { + Workbook wb = OrderStatService.me.statTransExport("超市时段销售汇总表",null, stm, etm, supermarket_id, stat_product, product_id, isprepaid); + render(new ExcelRender(stm + "_" + etm + "_超市" + (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + + /** + * 日销售汇总,按客户 + */ + @Before(DayValidator.class) + public void statDayCustomer() { + String tm = get("tm"); + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + boolean stat_product = getBoolean("stat_product", false); + Integer isprepaid = getInt("isprepaid"); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.statCustomer(tm, null, null, supermarket_id, stat_product, product_id, isprepaid))); + } else { + Workbook wb = OrderStatService.me.statCustomerExport("超市日销售汇总表", tm, null, null, supermarket_id, stat_product, product_id, isprepaid); + render(new ExcelRender(tm + "_超市日" + (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + /** + * 月销售统计 + */ + @Before(MonthValidator.class) + public void statMonthCustomer() { + String tm = get("tm"); + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + boolean stat_product = getBoolean("stat_product", false); + Integer isprepaid = getInt("isprepaid"); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.statCustomer(tm, null, null, supermarket_id, stat_product, product_id, isprepaid))); + } else { + Workbook wb = OrderStatService.me.statCustomerExport("超市月销售汇总表", tm, null, null, supermarket_id, stat_product, product_id, isprepaid); + render(new ExcelRender(tm + "_超市月" + (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + @Before(StartAndEndintervalValidator.class) + public void statRangeCustomer() { + String stm = get("stm"); // 前端将 YYYY-MM-DD 后面补 " 00:00:00" + String etm = get("etm"); // 前端将 YYYY-MM-DD 后面补 " 23:59:59" + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + boolean stat_product = getBoolean("stat_product", false); + Integer isprepaid = getInt("isprepaid"); + + if (export == 0) { + renderJson(Result.object(OrderStatService.me.statCustomer(null, stm, etm, supermarket_id, stat_product, product_id, isprepaid))); + } else { + Workbook wb = OrderStatService.me.statCustomerExport("超市时段销售汇总表",null, stm, etm, supermarket_id, stat_product, product_id, isprepaid); + render(new ExcelRender(stm + "_" + etm + "_超市" + (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java new file mode 100644 index 0000000..88c088d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/sale/OrderStatService.java @@ -0,0 +1,1425 @@ +package com.cowr.ssjygl.stat.sale; + +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.utils.DataUtil; +import com.cowr.common.utils.DateTimeUtil; +import com.cowr.common.view.ReportExcelStyle; +import com.cowr.model.Supermarket; +import com.cowr.ssjygl.CacheData; +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.*; + +public class OrderStatService { + private static Log log = Log.getLog(OrderStatService.class); + public static OrderStatService me = new OrderStatService(); + + /** + * 销售日明细 + * + * @param tm 日期 yyyy-MM-dd + * @param supermarket_id 超市id + * @param trans_co_id 物流公司id + * @param customer_id 客户id + * @param customer_name 客户名称 + * @param type 订单类型 1 销售(配送)订单, 3 外销(临时)订单 + * @param truck_license 车牌号 + * @param isprepaid 是否预付费 + * @return + */ + public List daydetail( + String tm, + Integer supermarket_id, + Integer trans_co_id, + Integer customer_id, + String customer_name, + Integer type, + String truck_license, + Integer isprepaid, + Integer product_id, + String sn + ) { + String sale_sql = " select\n" + + " t.sn\n" + + " , t.weight\n" + + " , t.unit_price\n" + + " , t.paid\n" + + " , t.total_price\n" + + " , t.customer_id\n" + + " , t.customer_name\n" + + " , t.truck_license\n" + + " , t.trans_price\n" + + " , t.trans_distance\n" + + " , t.supermarket_id\n" + + " , 1 type \n" + // OrderTypeEnum.SALE.getTypeid() + " , t.trans_co_id\n" + + " , t.trans_co_name\n" + + " , t.isprepaid\n" + + " , t.create_time \n" + + " , t.product_id \n" + + " , t.product_name \n" + + " , p.in_time, p.out_time, p.first_weight, p.second_weight \n" + + " from order_sale t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " where t.state = ? \n" + + " and t.create_time like ? \n"; + String temp_sql = " select\n" + + " t.sn\n" + + " , t.weight\n" + + " , t.unit_price\n" + + " , t.paid\n" + + " , t.total_price\n" + + " , t.customer_id\n" + + " , t.customer_name\n" + + " , t.truck_license\n" + + " , null trans_price\n" + + " , null trans_distance\n" + + " , t.supermarket_id\n" + + " , 3 type \n" + // OrderTypeEnum.TEMP.getTypeid() + " , t.trans_co_id\n" + + " , t.trans_co_name\n" + + " , t.isprepaid\n" + + " , t.create_time \n" + + " , t.product_id \n" + + " , t.product_name \n" + + " , p.in_time, p.out_time, p.first_weight, p.second_weight \n" + + " from order_temp t\n" + + " left join transport p on p.order_sn = t.sn \n" + + " where t.state = ? \n" + + " and t.create_time like ? \n"; + + List paraSaleList = new ArrayList<>(); + List paraTempList = new ArrayList<>(); + + paraSaleList.add(OrderStateEnum.RECEIVED.getStateid()); + paraSaleList.add(tm + "%"); + paraTempList.add(OrderStateEnum.RECEIVED.getStateid()); + paraTempList.add(tm + "%"); + + if (supermarket_id != null && supermarket_id > 0) { + sale_sql += " and t.supermarket_id = ? \n"; + temp_sql += " and t.supermarket_id = ? \n"; + paraSaleList.add(supermarket_id); + paraTempList.add(supermarket_id); + } + + if (trans_co_id != null && trans_co_id > 0) { + sale_sql += " and t.trans_co_id = ? \n"; + temp_sql += " and t.trans_co_id = ? \n"; + paraSaleList.add(trans_co_id); + paraTempList.add(trans_co_id); + } + + if (isprepaid != null && isprepaid != -1) { + sale_sql += " and t.isprepaid = ? \n"; + temp_sql += " and t.isprepaid = ? \n"; + paraSaleList.add(isprepaid); + paraTempList.add(isprepaid); + } + + if (customer_id != null && customer_id > 0) { + sale_sql += " and t.customer_id = ? \n"; + temp_sql += " and t.customer_id = ? \n"; + paraSaleList.add(customer_id); + paraTempList.add(customer_id); + } + + if (product_id != null && product_id > 0) { + sale_sql += " and t.product_id = ? \n"; + temp_sql += " and t.product_id = ? \n"; + paraSaleList.add(product_id); + paraTempList.add(product_id); + } + + if (StrKit.notBlank(customer_name)) { + sale_sql += " and t.customer_name like ? \n"; + temp_sql += " and t.customer_name like ? \n"; + paraSaleList.add("%" + customer_name + "%"); + paraTempList.add("%" + customer_name + "%"); + } + + if (StrKit.notBlank(truck_license)) { + sale_sql += " and t.truck_license like ? \n"; + temp_sql += " and t.truck_license like ? \n"; + paraSaleList.add("%" + truck_license + "%"); + paraTempList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(sn)) { + sale_sql += " and t.sn like ? \n"; + temp_sql += " and t.sn like ? \n"; + paraSaleList.add("%" + sn + "%"); + paraTempList.add("%" + sn + "%"); + } + + String sql = "select \n" + + " a.sn\n" + + " , a.weight\n" + + " , a.unit_price\n" + + " , a.paid\n" + + " , a.total_price\n" + + " , a.customer_id\n" + + " , a.customer_name\n" + + " , a.truck_license\n" + + " , a.trans_price\n" + + " , a.trans_distance\n" + + " , a.supermarket_id\n" + + " , s.name supermarket_name\n" + + " , a.type\n" + + " , a.trans_co_id\n" + + " , a.trans_co_name\n" + + " , a.create_time\n" + + " , a.isprepaid\n" + + " , a.product_id \n" + + " , a.product_name \n" + + " , a.in_time, a.out_time, a.first_weight, a.second_weight \n" + + " from( \n"; + + if (null == type) { + sql += sale_sql + " \n union \n " + temp_sql; + paraSaleList.addAll(paraTempList); + } else if (OrderTypeEnum.SALE.getTypeid() == type) { + sql += sale_sql; + } else if (OrderTypeEnum.TEMP.getTypeid() == type) { + sql += temp_sql; + paraSaleList = paraTempList; + } else { + return new ArrayList<>(); + } + + sql += " ) a\n" + + " left join supermarket s on s.id = a.supermarket_id\n"; + + + return Db.find(sql, paraSaleList.toArray()); + } + + public Workbook daydetailExport( + String tm, + Integer supermarket_id, + Integer trans_co_id, + Integer customer_id, + String customer_name, + Integer type, + String truck_license, + Integer isprepaid, + Integer product_id, + String sn + ) { + List list = daydetail(tm, + supermarket_id, + trans_co_id, + customer_id, + customer_name, + type, + truck_license, + isprepaid, + product_id, + sn); + + list.sort(new Comparator() { + public int compare(Record o1, Record o2) { + long d1 = o1.getDate("create_time").getTime(); + long d2 = o2.getDate("create_time").getTime(); + + if (d1 > d2) { + return 1; + } else if (d1 == d2) { + return 0; + } + + return -1; + } + }); + + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet("销售汇总表"); + + // 副标题 start + String subtitle = ""; + String sup_name = null; + + if (supermarket_id != null && supermarket_id > 0) { + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket != null) { + subtitle += supermarket.getName(); + sup_name = supermarket.getName(); + } + } + + try { + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdf.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += "销售汇总表"; + // 副标题 end + + // 表头 start + Row row = sheet.createRow(2); + 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("客户"); + // 筛选添加了超市时,列表中不显示超市 + if (sup_name == null) { + 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 + + double sum_weight = 0.0; + double sum_price = 0.0; + double sum_distance = 0.0; + double sum_trans_price = 0.0; + double isprepaid_sum_price = 0.0; + int datalen = list.size(); + int end_col = sup_name == null ? 14 : 13; + + for (int i = 0; i < datalen; i++) { + Record order = list.get(i); + + sum_weight += DataUtil.getDefaultByRecord(order, "weight"); + sum_price += DataUtil.getDefaultByRecord(order, "total_price"); + sum_distance += DataUtil.getDefaultByRecord(order, "trans_distance"); + sum_trans_price += DataUtil.getDefaultByRecord(order, "trans_price"); + + if (order.getInt("isprepaid") == 1) { + isprepaid_sum_price += DataUtil.getDefaultByRecord(order, "total_price"); + } + + row = sheet.createRow(i + 3); + a = 0; + row.createCell(a++).setCellValue(i + 1); + row.createCell(a++).setCellValue(DateTimeUtil.sdfhms.get().format(order.getDate("in_time"))); + row.createCell(a++).setCellValue(order.getStr("sn")); + row.createCell(a++).setCellValue(order.getStr("product_name")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "first_weight")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "second_weight")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "weight")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "total_price")); + row.createCell(a++).setCellValue(order.getStr("customer_name")); + if (sup_name == null) { + row.createCell(a++).setCellValue(order.getStr("supermarket_name")); + } + row.createCell(a++).setCellValue(order.getStr("trans_co_name")); + row.createCell(a++).setCellValue(order.getStr("truck_license")); + row.createCell(a++).setCellValue(order.getStr("trans_distance")); + row.createCell(a++).setCellValue(order.getStr("trans_price")); + row.createCell(a++).setCellValue(order.getStr("memo")); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + 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(sum_weight); + row.createCell(a++).setCellValue(sum_price); + row.createCell(a++).setCellValue(""); + if (sup_name == null) { + row.createCell(a++).setCellValue(""); + } + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(sum_distance); + row.createCell(a++).setCellValue(sum_trans_price); + row.createCell(a++).setCellValue(isprepaid_sum_price); + // 合计 end + + sheet.setColumnWidth(0, (int) ((4.13 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((18 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((15 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((7.5 + 0.71) * 256)); + sheet.setColumnWidth(4, (int) ((8 + 0.71) * 256)); + sheet.setColumnWidth(5, (int) ((12.5 + 0.71) * 256)); + + if (sup_name == null) { + sheet.setColumnWidth(6, (int) ((14.38 + 0.71) * 256)); + sheet.setColumnWidth(7, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(8, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(9, (int) ((21.5 + 0.71) * 256)); + sheet.setColumnWidth(10, (int) ((10.38 + 0.71) * 256)); + sheet.setColumnWidth(11, (int) ((10.38 + 0.71) * 256)); + } else { + sheet.setColumnWidth(6, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(7, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(8, (int) ((7.5 + 0.71) * 256)); + sheet.setColumnWidth(9, (int) ((10.38 + 0.71) * 256)); + sheet.setColumnWidth(10, (int) ((10.38 + 0.71) * 256)); + } + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col); + + return wb; + } + + /** + * 销售月统计,超市/客户的矩阵 + * + * @param tm YYYY-MM + * @return + */ + public Record monthgrid(String tm, Integer supermarket_id, Integer customer_id) { + // 使用实际支付金额统计 + String sql = "select t.customer_id \n" + + ", case \n" + + " when t.type = 1 then ifnull(t.customer_name, '民用') \n" + + " when t.type = 3 then case when isnull(t.customer_name) then '外销' else concat(t.customer_name, '(外销)') end \n" + + " end customer_name \n" + + " , t.supermarket_id, s.name supermarket_name, count(*) as cnt, sum(t.total_price) as total\n" + + " from (\n" + + " select t.customer_id, t.customer_name, t.supermarket_id, t.paid, t.total_price, 1 type \n" + + " from order_sale t\n" + + " where t.state = ? \n" + + " and t.create_time like ?\n" + + " union all\n" + + " select t.customer_id, t.customer_name, t.supermarket_id, t.paid, t.total_price, 3 type \n" + + " from order_temp t\n" + + " where t.state = ? \n" + + " and t.create_time like ?\n" + + " ) t\n" + + " left join supermarket s on s.id = t.supermarket_id\n" + + " where 1 = 1 \n"; + + List paraList = new ArrayList<>(); + + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + paraList.add(tm + "%"); + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + paraList.add(tm + "%"); + + if (supermarket_id != null && supermarket_id > 0) { + sql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (customer_id != null && customer_id > 0) { + sql += " and t.customer_id = ? \n"; + paraList.add(customer_id); + } + + sql += " group by t.customer_id, t.supermarket_id"; + + List dblist = Db.find(sql, paraList.toArray()); + Map spkeys = new HashMap<>(); // supermarket_id <-> supermarket_name + Map cumaps = new HashMap<>(); // customer_id <-> out record + + for (Record record : dblist) { + String supermarket_id_str = record.getStr("supermarket_id"); + int sql_supermarket_id = record.getInt("supermarket_id"); + String supermarket_name = record.getStr("supermarket_name"); + int sql_customer_id; + + if (record.get("customer_id") == null) { + sql_customer_id = 0; + } else { + sql_customer_id = record.getInt("customer_id"); + } + + spkeys.put(sql_supermarket_id, supermarket_name); // 反正可以直接覆盖,就不判断了 + + if (!cumaps.containsKey(sql_customer_id)) { + Record outobj = new Record(); + + outobj.set("total", 0.0d); // 这里必须先加一个进去 + + cumaps.put(sql_customer_id, outobj); + } + + Record outobj = cumaps.get(sql_customer_id); + outobj.set("id", sql_customer_id); + outobj.set("name", record.getStr("customer_name")); + outobj.set("total", outobj.getDouble("total") + record.getDouble("total")); + + outobj.set(supermarket_id_str, record.getDouble("total")); + } + + List cols = new ArrayList<>(); + + for (Map.Entry entry : spkeys.entrySet()) { + Record col = new Record(); + + col.set("id", entry.getKey()); + col.set("name", entry.getValue()); + + cols.add(col); + } + + Record col = new Record(); + col.set("id", "total"); + col.set("name", "合计"); + + cols.add(col); + + List rows = new ArrayList<>(); + rows.addAll(cumaps.values()); + + Record out = new Record(); + out.set("cols", cols); + out.set("rows", rows); + + return out; + } + + /** + * 销售月统计,超市/客户的矩阵 导出 + * + * @param tm + * @return + */ + public Workbook monthgridExport(String tm, Integer supermarket_id, Integer customer_id) { + Record grid = monthgrid(tm, supermarket_id, customer_id); + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet("销售月汇总"); + + // 副标题 start + String subtitle = ""; + + try { + subtitle += DateTimeUtil.sdfym.get().format(DateTimeUtil.sd.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += "销售月汇总表"; + + // 表头 start + List cols = grid.get("cols"); + List rows = grid.get("rows"); + + int end_col = cols.size() + 1; + int a = 0; + + Row row = sheet.createRow(2); + row.createCell(a++).setCellValue("序号"); + row.createCell(a++).setCellValue("客户名称"); + for (Record col : cols) { + row.createCell(a++).setCellValue(col.getStr("name")); + } + // 表头 end + + // 填充数据 start + int datalen = rows.size(); + for (int i = 0; i < datalen; i++) { + Record rowobj = rows.get(i); + row = sheet.createRow(i + 3); + a = 0; + + row.createCell(a++).setCellValue(i + 1); + row.createCell(a++).setCellValue(rowobj.getStr("name")); + + for (Record col : cols) { + row.createCell(a++).setCellValue(rowobj.getStr(col.getStr("id"))); + } + } + // 填充数据 end + + sheet.setColumnWidth(0, (int) ((4.13 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((15 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((16.13 + 0.71) * 256)); + sheet.setColumnWidth(4, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(5, (int) ((18 + 0.71) * 256)); + sheet.setColumnWidth(6, (int) ((8.75 + 0.71) * 256)); + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col); + + return wb; + } + + /** + * 日、月销售统计 + * + * @return + */ + public List salestat(String tm) { + String sql = "select s.id, s.name, s.name2, p.`name` product_name, ifnull(a.orderCount, 0) as orderCount, ifnull(a.totalPrice, 0) as totalPrice, ifnull(a.weight, 0) as weight\n" + + " from supermarket_product t\n" + + " left join (\n" + + " select t.id, t.product_id, count(*) as orderCount, sum(t.total_price) as totalPrice, sum(t.weight) as weight\n" + + " from (\n" + + " select t.supermarket_id as id, t.paid, t.total_price, t.weight, t.product_id\n" + + " from order_sale t\n" + + " where t.state = ? \n" + + " and t.create_time like ? \n" + + " union all\n" + + " 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" + + " ) 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"; + + List dblist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), tm + "%", OrderStateEnum.RECEIVED.getStateid(), tm + "%"); + + Record total = new Record(); + total.set("id", 0); + total.set("name", "合计"); + total.set("orderCount", 0); + total.set("totalPrice", 0); + total.set("weight", 0); + + for (Record record : dblist) { + total.set("orderCount", total.getDouble("orderCount") + record.getDouble("orderCount")); + total.set("totalPrice", total.getDouble("totalPrice") + record.getDouble("totalPrice")); + total.set("weight", total.getDouble("weight") + record.getDouble("weight")); + } + + total.set("weight", String.format("%.2f", total.getDouble("weight"))); + + dblist.add(total); + + return dblist; + } + + /** + * 按客户分类 + * + * @param tm + * @return + */ + public List salestatCustomer(String tm) { + String sql = "select ifnull(t.id, 0) id, ifnull(t.name, '民用') name, ifnull(a.orderCount, 0) orderCount, ifnull(a.totalPrice, 0) totalPrice, ifnull(a.weight, 0) weight\n" + + " from (\n" + + " select t.id,count(*) as orderCount, sum(t.total_price) as totalPrice, sum(t.weight) as weight\n" + + " from (\n" + + " select t.customer_id as id, t.paid, t.total_price, t.weight\n" + + " from order_sale t\n" + + " where t.state = ?\n" + + " and t.create_time like ?\n" + + " union all\n" + + " select t.customer_id as id, t.paid, t.total_price, t.weight\n" + + " from order_temp t\n" + + " where t.state = ?\n" + + " and t.create_time like ?\n" + + " ) t\n" + + " group by t.id\n" + + " ) a\n" + + " left join customer t on a.id = t.id"; + + List dblist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), tm + "%", OrderStateEnum.RECEIVED.getStateid(), tm + "%"); + + Record total = new Record(); + total.set("id", 0); + total.set("name", "合计"); + total.set("orderCount", 0); + total.set("totalPrice", 0); + total.set("weight", 0); + + for (Record record : dblist) { + total.set("orderCount", total.getDouble("orderCount") + record.getDouble("orderCount")); + total.set("totalPrice", total.getDouble("totalPrice") + record.getDouble("totalPrice")); + total.set("weight", total.getDouble("weight") + record.getDouble("weight")); + } + + total.set("weight", String.format("%.2f", total.getDouble("weight"))); + + dblist.add(total); + + return dblist; + } + + public Workbook daysalestatExport(String tm) { + String title = "销售日统计"; + + + // 副标题 start + String subtitle = ""; + try { + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdf.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += title; + + return salestatExport(tm, title, subtitle); + } + + public Workbook monthsalestatExport(String tm) { + String title = "销售月统计"; + + // 副标题 start + String subtitle = ""; + try { + subtitle += DateTimeUtil.sdfym.get().format(DateTimeUtil.sd.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += title; + + return salestatExport(tm, title, subtitle); + } + + + /** + * 销售日、月统计 + * + * @param tm + * @return + */ + public Workbook salestatExport(String tm, String title, String subtitle) { + List list = salestat(tm); + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(title); + + // 表头 start + Row row = sheet.createRow(2); + row.setHeight((short) (30 * 20)); + int a = 0; + + row.createCell(a++).setCellValue("超市"); + row.createCell(a++).setCellValue("品类"); + row.createCell(a++).setCellValue("订单量"); + row.createCell(a++).setCellValue("销量(单位:吨)"); + row.createCell(a++).setCellValue("金额(单位:元)"); + // 表头 end + + int end_col = 4; + int datalen = list.size(); + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + row = sheet.createRow(i + 3); + row.setHeight((short) (30 * 20)); + a = 0; + + String strweight = ""; + String strtotalPrice = ""; + + Double weight = DataUtil.getDoubleByRecord(record, "weight"); + Double totalPrice = DataUtil.getDoubleByRecord(record, "totalPrice"); + + if (weight != null) { + strweight = String.format("%.2f", weight); + } + if (totalPrice != null) { + strtotalPrice = String.format("%.2f", totalPrice); + } + + row.createCell(a++).setCellValue(record.getStr("name")); + row.createCell(a++).setCellValue(record.getStr("product_name")); + row.createCell(a++).setCellValue(record.getStr("orderCount")); + row.createCell(a++).setCellValue(strweight); + row.createCell(a++).setCellValue(strtotalPrice); + } + + sheet.setColumnWidth(0, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((18 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((18 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((18 + 0.71) * 256)); + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col, 3); + + return wb; + } + + /** + * 销售日、月统计 按客户 + * + * @param tm + * @return + */ + public Workbook salestatCustomerExport(String tm, String title, String subtitle) { + List list = salestatCustomer(tm); + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(title); + + // 表头 start + Row row = sheet.createRow(2); + row.setHeight((short) (30 * 20)); + int a = 0; + + row.createCell(a++).setCellValue("序号"); + row.createCell(a++).setCellValue("客户"); + row.createCell(a++).setCellValue("订单量"); + row.createCell(a++).setCellValue("销量(单位:吨)"); + row.createCell(a++).setCellValue("金额(单位:元)"); + // 表头 end + + int end_col = 4; + int datalen = list.size(); + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + row = sheet.createRow(i + 3); + row.setHeight((short) (30 * 20)); + a = 0; + + String strweight = ""; + String strtotalPrice = ""; + + Double weight = DataUtil.getDoubleByRecord(record, "weight"); + Double totalPrice = DataUtil.getDoubleByRecord(record, "totalPrice"); + + if (weight != null) { + strweight = String.format("%.2f", weight); + } + if (totalPrice != null) { + strtotalPrice = String.format("%.2f", totalPrice); + } + + row.createCell(a++).setCellValue(i + 1); + row.createCell(a++).setCellValue(record.getStr("name")); + row.createCell(a++).setCellValue(record.getStr("orderCount")); + row.createCell(a++).setCellValue(strweight); + row.createCell(a++).setCellValue(strtotalPrice); + } + + sheet.setColumnWidth(0, (int) ((20 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((18 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((18 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((18 + 0.71) * 256)); + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col, 3); + + return wb; + } + + + public Workbook daysalestatCustomerExport(String tm) { + String title = "销售日统计"; + + + // 副标题 start + String subtitle = ""; + try { + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdf.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += title; + + return salestatCustomerExport(tm, title, subtitle); + } + + public Workbook monthsalestatCustomerExport(String tm) { + String title = "销售月统计"; + + // 副标题 start + String subtitle = ""; + try { + subtitle += DateTimeUtil.sdfym.get().format(DateTimeUtil.sd.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += title; + + return salestatCustomerExport(tm, title, subtitle); + } + + /** + * 销售月逐日统计 + * + * @param tm YYYY-MM + * @return + */ + public List mdstat(String tm) { + String sql = "select date_format(t.create_time, '%Y-%m-%d') as date, sum(t.weight) as weight, sum(t.total_price) as totalPrice\n" + + "from (\n" + + " select t.create_time, t.weight, t.paid, t.total_price\n" + + " from order_sale t\n" + + " where t.state = ? \n" + + " and t.create_time like ? \n" + + " union all\n" + + " select t.create_time, t.weight, t.paid, t.total_price\n" + + " from order_temp t\n" + + " where t.state = ? \n" + + " and t.create_time like ? \n" + + ") t\n" + + "group by date_format(t.create_time, '%Y-%m-%d')\n" + + "order by date_format(t.create_time, '%Y-%m-%d')"; + + List dblist = Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), tm + "%", OrderStateEnum.RECEIVED.getStateid(), tm + "%"); + + Record total = new Record(); + total.set("date", null); + total.set("weight", 0.0d); + total.set("totalPrice", 0.0d); + + for (int i = 0; i < dblist.size(); i++) { + Record record = dblist.get(i); + + double weight = record.getDouble("weight"); + double totalPrice = record.getDouble("totalPrice"); + + if (i > 0) { + Record preobj = dblist.get(i - 1); + + record.set("sweight", preobj.getDouble("sweight") + weight); + record.set("stotalPrice", preobj.getDouble("stotalPrice") + totalPrice); + } else { + record.set("sweight", weight); + record.set("stotalPrice", totalPrice); + } + + total.set("weight", total.getDouble("weight") + weight); + total.set("totalPrice", total.getDouble("totalPrice") + totalPrice); + } + + dblist.add(total); + + return dblist; + } + + /** + * 销售月逐日统计 + * + * @param tm YYYY-MM + * @return + */ + public Workbook mdstatExport(String tm) { + List list = mdstat(tm); + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet("销售月逐日统计"); + + // 副标题 start + String subtitle = ""; + try { + subtitle += DateTimeUtil.sdfym.get().format(DateTimeUtil.sd.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += "销售月逐日统计"; + + // 表头 start + Row row = sheet.createRow(2); + int a = 0; + row.createCell(a++).setCellValue("日期"); + row.createCell(a++).setCellValue("销量"); + row.createCell(a++).setCellValue("销售量截止累计"); + row.createCell(a++).setCellValue("金额"); + row.createCell(a++).setCellValue("销售金额截止累计"); + // 表头 end + + int end_col = 4; + int datalen = list.size(); + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + row = sheet.createRow(i + 3); + a = 0; + + String date = record.get("date"); + + if (date == null || "null".equals(date)) { + date = "合计"; + + row.createCell(a++).setCellValue(date); + row.createCell(a++).setCellValue(record.getDouble("weight")); + row.createCell(3).setCellValue(record.getDouble("totalPrice")); + } else { + date = date.substring(5, 10).replace("-", "月") + "日"; + row.createCell(a++).setCellValue(date); + row.createCell(a++).setCellValue(record.getDouble("weight")); + row.createCell(a++).setCellValue(record.getDouble("sweight")); + row.createCell(a++).setCellValue(record.getDouble("totalPrice")); + row.createCell(a++).setCellValue(record.getDouble("stotalPrice")); + } + } + + sheet.setColumnWidth(0, (int) ((10 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((16 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((16 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((16 + 0.71) * 256)); + sheet.setColumnWidth(4, (int) ((18 + 0.71) * 256)); + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col, 3); + + return wb; + } + + + /** + * 超市每日销售汇总 + *

+ * tm 和 stm, etm 只能有一组有效 + * + * @param tm 时间 YYYY-MM-DD 或者 YYYY-MM + * @param stm 起始时间 YYYY-MM-DD + * @param etm 截至时间 YYYY-MM-DD + * @param supermarket_id 超市id + * @param stat_product 是否统计品类 + * @param product_id 品类id,不传时,统计所有的 + * @param isprepaid 是否预付费 + * @return + */ + public List statTrans(String tm, String stm, String etm, Integer supermarket_id, boolean stat_product, Integer product_id, Integer isprepaid) { + String sale_sql; + String temp_sql; + + List paraSale = new ArrayList<>(); + List paraTemp = new ArrayList<>(); + + if (stat_product) { + sale_sql = "select " + + " t.trans_co_id, t.product_id, t.product_name, sum(t.weight) weight, sum(t.total_price) total_price, " + + " count(t.sn) orderCount, sum(t.trans_distance) trans_distance, sum(t.trans_price) trans_price " + + " from order_sale t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " where t.state = ? \n"; + + temp_sql = "select -1 trans_co_id, t.product_id, t.product_name, ifnull(sum(t.weight), 0) weight, ifnull(sum(t.total_price), 0) total_price," + + " count(t.sn) orderCount, 0 trans_distance, 0 trans_price " + + " from order_temp t\n" + + " left join transport p on p.order_sn = t.sn \n" + + " where t.state = ? \n"; + + paraSale.add(OrderStateEnum.RECEIVED.getStateid()); + paraTemp.add(OrderStateEnum.RECEIVED.getStateid()); + + if (supermarket_id != null) { + sale_sql += " and t.supermarket_id = ? \n"; + paraSale.add(supermarket_id); + + temp_sql += " and t.supermarket_id = ? \n"; + paraTemp.add(supermarket_id); + } + + if (tm == null) { + if (!StrKit.notBlank(stm, etm)) { + log.error("参数错误"); + return new ArrayList<>(); + } + + sale_sql += " and t.create_time between ? and ? \n"; + paraSale.add(stm); + paraSale.add(etm); + + temp_sql += " and t.create_time between ? and ? \n"; + paraTemp.add(stm); + paraTemp.add(etm); + } else { + sale_sql += " and t.create_time like ? \n"; + paraSale.add(tm + "%"); + + temp_sql += " and t.create_time like ? \n"; + paraTemp.add(tm + "%"); + } + + if (product_id != null) { + sale_sql += " and t.product_id = ? \n"; + paraSale.add(product_id); + + temp_sql += " and t.product_id = ? \n"; + paraTemp.add(product_id); + } + + if (isprepaid != null) { + sale_sql += " and t.isprepaid = ? \n"; + paraSale.add(isprepaid); + + temp_sql += " and t.isprepaid = ? \n"; + paraTemp.add(isprepaid); + } + + sale_sql += " group by t.trans_co_id, t.product_id \n"; + temp_sql += " group by t.product_id "; + } else { + sale_sql = "select t.trans_co_id, sum(t.weight) weight, sum(t.total_price) total_price, count(t.sn) orderCount" + + " , sum(t.trans_distance) trans_distance, sum(t.trans_price) trans_price " + + " from order_sale t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " where t.state = ? \n"; + + temp_sql = "select -1 trans_co_id, ifnull(sum(t.weight), 0) weight, ifnull(sum(t.total_price), 0) total_price, count(t.sn) orderCount, 0 trans_distance, 0 trans_price " + + " from order_temp t\n" + + " left join transport p on p.order_sn = t.sn \n" + + " where t.state = ? \n"; + + paraSale.add(OrderStateEnum.RECEIVED.getStateid()); + paraTemp.add(OrderStateEnum.RECEIVED.getStateid()); + + if (supermarket_id != null) { + sale_sql += " and t.supermarket_id = ? \n"; + paraSale.add(supermarket_id); + + temp_sql += " and t.supermarket_id = ? \n"; + paraTemp.add(supermarket_id); + } + + if (tm == null) { + if (!StrKit.notBlank(stm, etm)) { + log.error("参数错误"); + return new ArrayList<>(); + } + + sale_sql += " and t.create_time between ? and ? \n"; + paraSale.add(stm); + paraSale.add(etm); + + temp_sql += " and t.create_time between ? and ? \n"; + paraTemp.add(stm); + paraTemp.add(etm); + } else { + sale_sql += " and t.create_time like ? \n"; + paraSale.add(tm + "%"); + + temp_sql += " and t.create_time like ? \n"; + paraTemp.add(tm + "%"); + } + + if (isprepaid != null) { + sale_sql += " and t.isprepaid = ? \n"; + paraSale.add(isprepaid); + + temp_sql += " and t.isprepaid = ? \n"; + paraTemp.add(isprepaid); + } + + sale_sql += " group by t.trans_co_id \n"; + } + + String sql = "select ifnull(co.name, '外销') trans_co_name, a.* from( \n" + + sale_sql + + " union \n " + + temp_sql + + " ) a\n" + + " left join transport_company co on co.id = a.trans_co_id \n" + + " order by a.trans_co_id desc"; + + paraSale.addAll(paraTemp); + + List list = Db.find(sql, paraSale.toArray()); + + // 只有一个统计总数为 0 的记录时,删除该记录后返回 + if (list != null && list.size() == 1) { + Record record = list.get(0); + + if (record.getInt("orderCount") == 0) { + list.remove(record); + } + } + + return list; + } + + public Workbook statTransExport(String name, String tm, String stm, String etm, Integer supermarket_id, boolean stat_product, Integer product_id, Integer isprepaid) { + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(name); + + List list = statTrans(tm, stm, etm, supermarket_id, stat_product, product_id, isprepaid); + + int datalen = list.size(); + int end_col = stat_product ? 8 : 7; // 数据共有几列 + String subtitle = ""; + + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket != null) { + subtitle += supermarket.getName(); + } + + try { + if (tm != null) { + if (tm.length() == 10) { // 月汇总 + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdf.get().parse(tm)); + } else { + subtitle += DateTimeUtil.sdfym.get().format(DateTimeUtil.sd.get().parse(tm)); + } + } else { + subtitle += stm + " 至 " + etm + " "; + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表"; + + // 表头 start + Row row = sheet.createRow(2); + int a = 0; + row.createCell(a++).setCellValue("序号"); + if (stat_product) { + 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 + + double sum_weight = 0.0; + double sum_price = 0.0; + double sum_distance = 0.0; + double sum_trans_price = 0.0; + int sum_cnt = 0; + + for (int i = 0; i < datalen; i++) { + Record order = list.get(i); + + sum_weight += DataUtil.getDefaultByRecord(order, "weight"); + sum_price += DataUtil.getDefaultByRecord(order, "total_price"); + sum_distance += DataUtil.getDefaultByRecord(order, "trans_distance"); + sum_trans_price += DataUtil.getDefaultByRecord(order, "trans_price"); + sum_cnt += order.getInt("orderCount"); + + row = sheet.createRow(i + 3); + a = 0; + row.createCell(a++).setCellValue(i + 1); + if (stat_product) { + row.createCell(a++).setCellValue(order.getStr("product_name")); + } + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "weight")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "total_price")); + row.createCell(a++).setCellValue(order.getStr("orderCount")); + row.createCell(a++).setCellValue(order.getStr("trans_co_name")); + row.createCell(a++).setCellValue(order.getStr("trans_distance")); + row.createCell(a++).setCellValue(order.getStr("trans_price")); + row.createCell(a++).setCellValue(""); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + a = 0; + row.createCell(a++).setCellValue("合计"); + if (stat_product) { + row.createCell(a++).setCellValue(""); + } + row.createCell(a++).setCellValue(sum_weight); + row.createCell(a++).setCellValue(sum_price); + row.createCell(a++).setCellValue(sum_cnt); + row.createCell(a++).setCellValue(""); + row.createCell(a++).setCellValue(sum_distance); + row.createCell(a++).setCellValue(sum_trans_price); + // 合计 end + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col); + + return wb; + } + + + /** + * 超市每日销售汇总 + *

+ * tm 和 stm, etm 只能有一组有效 + * + * @param tm 时间 YYYY-MM-DD 或者 YYYY-MM + * @param stm 起始时间 YYYY-MM-DD + * @param etm 截至时间 YYYY-MM-DD + * @param supermarket_id 超市id + * @param stat_product 是否统计品类 + * @param product_id 品类id,不传时,统计所有的 + * @param isprepaid 是否预付费 + * @return + */ + public List statCustomer(String tm, String stm, String etm, Integer supermarket_id, boolean stat_product, Integer product_id, Integer isprepaid) { + String sale_sql = " select t.customer_id, sum(t.weight) weight, sum(t.total_price) total_price, count(t.sn) orderCount "; + String temp_sql = " select t.customer_id, ifnull(sum(t.weight), 0) weight, ifnull(sum(t.total_price), 0) total_price, count(t.sn) orderCount "; + + List paraSale = new ArrayList<>(); + List paraTemp = new ArrayList<>(); + + if (stat_product) { + sale_sql += " , t.product_id, max(t.product_name) product_name \n"; + temp_sql += " , t.product_id, max(t.product_name) product_name \n"; + } + + sale_sql += " from order_sale t \n" + + " where t.state = ? \n"; + + temp_sql += " from order_temp t\n" + + " where t.state = ? \n"; + + paraSale.add(OrderStateEnum.RECEIVED.getStateid()); + paraTemp.add(OrderStateEnum.RECEIVED.getStateid()); + + if (supermarket_id != null) { + sale_sql += " and t.supermarket_id = ? \n"; + paraSale.add(supermarket_id); + + temp_sql += " and t.supermarket_id = ? \n"; + paraTemp.add(supermarket_id); + } + + if (tm == null) { + if (!StrKit.notBlank(stm, etm)) { + log.error("参数错误"); + return new ArrayList<>(); + } + + sale_sql += " and t.create_time between ? and ? \n"; + paraSale.add(stm); + paraSale.add(etm); + + temp_sql += " and t.create_time between ? and ? \n"; + paraTemp.add(stm); + paraTemp.add(etm); + } else { + sale_sql += " and t.create_time like ? \n"; + paraSale.add(tm + "%"); + + temp_sql += " and t.create_time like ? \n"; + paraTemp.add(tm + "%"); + } + + if (isprepaid != null) { + sale_sql += " and t.isprepaid = ? \n"; + paraSale.add(isprepaid); + + temp_sql += " and t.isprepaid = ? \n"; + paraTemp.add(isprepaid); + } + + + if (stat_product) { + if (product_id != null) { + sale_sql += " and t.product_id = ? \n"; + paraSale.add(product_id); + + temp_sql += " and t.product_id = ? \n"; + paraTemp.add(product_id); + } + sale_sql += " group by t.customer_id, t.product_id \n"; + temp_sql += " group by t.customer_id, t.product_id \n"; + }else { + sale_sql += " group by t.customer_id \n"; + temp_sql += " group by t.customer_id \n"; + } + + String sql = "select ifnull(c.name, '民用') customer_name, a.* from( \n" + + sale_sql + + " union \n " + + temp_sql + + " ) a\n" + + " left join customer c on c.id = a.customer_id \n" + + " order by a.customer_id desc"; + + paraSale.addAll(paraTemp); + + List list = Db.find(sql, paraSale.toArray()); + + // 只有一个统计总数为 0 的记录时,删除该记录后返回 + if (list != null && list.size() == 1) { + Record record = list.get(0); + + if (record.getInt("orderCount") == 0) { + list.remove(record); + } + } + + return list; + } + + public Workbook statCustomerExport(String name, String tm, String stm, String etm, Integer supermarket_id, boolean stat_product, Integer product_id, Integer isprepaid) { + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(name); + + List list = statCustomer(tm, stm, etm, supermarket_id, stat_product, product_id, isprepaid); + + int datalen = list.size(); + int end_col = stat_product ? 6 : 5; // 数据共有几列 + String subtitle = ""; + + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket != null) { + subtitle += supermarket.getName(); + } + + try { + if (tm != null) { + if (tm.length() == 10) { // 月汇总 + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdf.get().parse(tm)); + } else { + subtitle += DateTimeUtil.sdfym.get().format(DateTimeUtil.sd.get().parse(tm)); + } + } else { + subtitle += stm + " 至 " + etm + " "; + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + subtitle += (isprepaid != null && isprepaid == 1 ? "预付费" : "") + "销售汇总表"; + + // 表头 start + Row row = sheet.createRow(2); + int a = 0; + row.createCell(a++).setCellValue("序号"); + if (stat_product) { + 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 + + double sum_weight = 0.0; + double sum_price = 0.0; + int sum_cnt = 0; + + for (int i = 0; i < datalen; i++) { + Record order = list.get(i); + + sum_weight += DataUtil.getDefaultByRecord(order, "weight"); + sum_price += DataUtil.getDefaultByRecord(order, "total_price"); + sum_cnt += order.getInt("orderCount"); + + row = sheet.createRow(i + 3); + a = 0; + row.createCell(a++).setCellValue(i + 1); + if (stat_product) { + row.createCell(a++).setCellValue(order.getStr("product_name")); + } + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "weight")); + row.createCell(a++).setCellValue(DataUtil.getDefaultByRecord(order, "total_price")); + row.createCell(a++).setCellValue(order.getStr("orderCount")); + row.createCell(a++).setCellValue(order.getStr("customer_name")); + row.createCell(a++).setCellValue(""); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + a = 0; + row.createCell(a++).setCellValue("合计"); + if (stat_product) { + row.createCell(a++).setCellValue(""); + } + row.createCell(a++).setCellValue(sum_weight); + row.createCell(a++).setCellValue(sum_price); + row.createCell(a++).setCellValue(sum_cnt); + row.createCell(a++).setCellValue(""); + // 合计 end + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col); + + return wb; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatController.java new file mode 100644 index 0000000..9e7a33b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatController.java @@ -0,0 +1,33 @@ +package com.cowr.ssjygl.stat.transfer; + +import com.cowr.common.base.BaseController; +import com.cowr.common.validator.DayValidator; +import com.cowr.common.view.ExcelRender; +import com.cowr.common.view.Result; +import com.jfinal.aop.Before; +import org.apache.poi.ss.usermodel.Workbook; + +public class OrderTransferStatController extends BaseController { + + /** + * 转运明细 + */ + @Before(DayValidator.class) + public void detail() { + String sn = get("sn"); + String truck_license = getUpperCaseVal("truck_license"); + String tm = get("tm"); + Integer supermarket_id = getInt("supermarket_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + Integer trans_co_id = getInt("trans_co_id"); + Integer product_id = getInt("product_id"); + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + + if (export == 0) { + renderJson(Result.object(OrderTransferStatService.me.detail(sn, tm, supermarket_id, sandfarm_id, trans_co_id, truck_license, product_id))); + } else { + Workbook wb = OrderTransferStatService.me.detailExport(sn, tm, supermarket_id, sandfarm_id, trans_co_id, truck_license, product_id); + render(new ExcelRender(tm + "_转运明细_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatService.java new file mode 100644 index 0000000..69eb5be --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/stat/transfer/OrderTransferStatService.java @@ -0,0 +1,234 @@ +package com.cowr.ssjygl.stat.transfer; + +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.utils.DateTimeUtil; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.ReportExcelStyle; +import com.cowr.model.Supermarket; +import com.cowr.ssjygl.CacheData; +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.Comparator; +import java.util.List; + +public class OrderTransferStatService { + public static OrderTransferStatService me = new OrderTransferStatService(); + private static Log log = Log.getLog(OrderTransferStatService.class); + + public List detail( + String sn, + String tm, + Integer supermarket_id, + Integer sandfarm_id, + Integer trans_co_id, + String truck_license, + Integer product_id + ) { + + String sql = "select t.* " + + ", p.order_sn \n" + + ", p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode \n" + + ", p.first_weight, p.second_weight, p.first_weigh_mode, p.second_weight_mode \n" + + ", p.first_pic, p.first_weight_which, p.second_weight_which, p.second_pic \n" + + ", p.arrive_time, p.type, p.memo transport_memo \n" + + ", s.name supermarket_name, f.name sandfarm_name \n" + + " from order_transfer t \n" + + " left join transport p on p.order_sn = t.sn \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join sandfarm f on f.id = t.sandfarm_id \n" + + " where t.state = ? \n"; + List paraList = new ArrayList<>(); + + paraList.add(OrderStateEnum.RECEIVED.getStateid()); + + if (StrKit.notBlank(sn)) { + sql += " and t.sn like ? \n"; + paraList.add("%" + sn + "%"); + } + + if (supermarket_id != null) { + sql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (sandfarm_id != null) { + sql += " and t.sandfarm_id = ? \n"; + paraList.add(sandfarm_id); + } + + if (trans_co_id != null) { + sql += " and t.trans_co_id = ? \n"; + paraList.add(trans_co_id); + } + + if (product_id != null) { + sql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + if (StrKit.notBlank(truck_license)) { + sql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(tm)) { + sql += " and t.create_time like ? \n"; + paraList.add(tm + "%"); + } + + return Db.find(sql, paraList.toArray()); + } + + + /** + * 导出转运详细报表 + * + * @param tm + * @param supermarket_id + * @param sandfarm_id + * @return + */ + public Workbook detailExport( + String sn, + String tm, + Integer supermarket_id, + Integer sandfarm_id, + Integer trans_co_id, + String truck_license, + Integer product_id + ) { + List list = detail(sn, tm, supermarket_id, sandfarm_id, trans_co_id, truck_license, product_id); + + list.sort(new Comparator() { + public int compare(Record o1, Record o2) { + long d1 = o1.getDate("create_time").getTime(); + long d2 = o2.getDate("create_time").getTime(); + + if (d1 > d2) { + return 1; + } else if (d1 == d2) { + return 0; + } + + return -1; + } + }); + + Workbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet("转运详细报表"); + + // 副标题 start + String subtitle = ""; + String sup_name = null; + + if (supermarket_id != null && supermarket_id > 0) { + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket != null) { + subtitle += supermarket.getName(); + sup_name = supermarket.getName(); + } + } + + try { + subtitle += DateTimeUtil.sdfymd.get().format(DateTimeUtil.sdf.get().parse(tm)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + subtitle += "转运汇总表"; + + + // 表头 start + Row row = sheet.createRow(2); + int a = 0; + + row.createCell(a++).setCellValue("序号"); + row.createCell(a++).setCellValue("转运单编号"); + row.createCell(a++).setCellValue("转运砂场"); + // 筛选添加了超市时,列表中不显示超市 + if (sup_name == null) { + 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 + + double sum_weight = 0.0; + double sum_distance = 0.0; + double sum_trans_price = 0.0; + int datalen = list.size(); + int end_col = sup_name == null ? 9 : 8; + + for (int i = 0; i < datalen; i++) { + Record record = list.get(i); + Double weigth = record.getDouble("weight"); + a = 0; + + sum_weight += weigth; + sum_distance += record.getDouble("trans_distance"); + sum_trans_price += record.getDouble("trans_price"); + + row = sheet.createRow(i + 3); + row.createCell(a++).setCellValue(i + 1); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "sn")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "sandfarm_name")); + + // 筛选添加了超市时,列表中不显示超市 + if (sup_name == null) { + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "supermarket_name")); + } + + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "trans_co_name")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "truck_license")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "trans_distance")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "weight")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "source_weight")); + row.createCell(a++).setCellValue(StrUtil.getRecordStr(record, "trans_price")); + } + + // 合计 start + row = sheet.createRow(datalen + 3); + 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(sum_distance); + row.createCell(a++).setCellValue(sum_weight); + row.createCell(a++).setCellValue(sum_trans_price); + // 合计 end + + sheet.setColumnWidth(0, (int) ((4.13 + 0.71) * 256)); + sheet.setColumnWidth(1, (int) ((12.5 + 0.71) * 256)); + sheet.setColumnWidth(2, (int) ((10.75 + 0.71) * 256)); + sheet.setColumnWidth(3, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(4, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(5, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(6, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(7, (int) ((10.75 + 0.71) * 256)); + sheet.setColumnWidth(8, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(9, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(10, (int) ((9.13 + 0.71) * 256)); + sheet.setColumnWidth(11, (int) ((7.75 + 0.71) * 256)); + sheet.setColumnWidth(12, (int) ((16.13 + 0.71) * 256)); + sheet.setColumnWidth(13, (int) ((16.13 + 0.71) * 256)); + sheet.setColumnWidth(14, (int) ((12.5 + 0.71) * 256)); + + ReportExcelStyle.setCommonStyle(wb, sheet, CacheData.print_vendor, subtitle, datalen, end_col); + + return wb; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketIdValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketIdValidator.java new file mode 100644 index 0000000..b6a6b75 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketIdValidator.java @@ -0,0 +1,23 @@ +package com.cowr.ssjygl.supermarket; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Thu Jun 27 15:45:07 CST 2019 + * TableName: supermarket + * Remarks: 超市 + * PrimaryKey: id + */ +public class SupermarketIdValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "必须选定一个超市"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketPKValidator.java new file mode 100644 index 0000000..f6cdf7b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.supermarket; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Supermarket; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: supermarket + * Remarks: 销售点(超市) + * PrimaryKey: id + */ +public class SupermarketPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java new file mode 100644 index 0000000..aca0e13 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketService.java @@ -0,0 +1,132 @@ +package com.cowr.ssjygl.supermarket; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Supermarket; +import com.cowr.model.SupermarketProduct; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: supermarket + * Remarks: 销售点(超市) + * PrimaryKey: id + */ +public class SupermarketService extends BaseService { + public static final SupermarketService me = new SupermarketService(); + + public BigDecimal getSupUnitPrice(Integer supermarket_id, Integer product_id){ + SupermarketProduct sp = SupermarketProduct.dao.findByIds(supermarket_id, product_id); + + return sp == null ? new BigDecimal(0) : sp.getUnitPrice(); + } + + /** + * 获取所有超市和商品的配置 + * 数据量不多,都加载进来 + * @return + */ + private Map> getSupProduct(){ + List list = Db.find("select t.supermarket_id, p.id, p.name, t.unit_price from supermarket_product t\n" + + " left join product p on t.product_id = p.id"); + + Map> map = new HashMap<>(); + + for(Record record : list){ + int supermarket_id = record.getInt("supermarket_id"); + + if(!map.containsKey(supermarket_id)){ + map.put(supermarket_id, new ArrayList<>()); + } + + map.get(supermarket_id).add(record); + } + + return map; + } + + public Page find(PageParam pp, String name, Integer del) { + String selectsql = "select * "; + String fromsql = "from supermarket t where 1=1 \n"; + List paraList = new ArrayList<>(); + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + if (StrKit.notBlank(name)) { + fromsql += " and t.name like ?"; + paraList.add("%" + name + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Supermarket.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + Map> productmap = getSupProduct(); + Page page = Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + List list = page.getList(); + + for(Record record : list){ + int supermarket_id = record.getInt("id"); + + if(productmap.containsKey(supermarket_id)){ + record.set("products", productmap.get(supermarket_id)); + } + } + + return page; + } + + public List list() { + List list = Db.find("select * from supermarket t where t.del = 0"); + Map> productmap = getSupProduct(); + + for(Record record : list){ + int supermarket_id = record.getInt("id"); + + if(productmap.containsKey(supermarket_id)){ + record.set("products", productmap.get(supermarket_id)); + } + } + + return list; + } + + public Result get(int id){ + Supermarket supermarket = Supermarket.dao.findById(id); + + if(supermarket == null){ + return Result.failed("未找到超市记录"); + } + Record out = supermarket.toRecord(); + + out.set("products", Db.find("select t.supermarket_id, p.id, p.name, t.unit_price from supermarket_product t\n" + + " left join product p on t.product_id = p.id \n" + + " where t.supermarket_id = ?", id)); + + return Result.success(out); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketValidator.java new file mode 100644 index 0000000..e877090 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/SupermarketValidator.java @@ -0,0 +1,43 @@ +package com.cowr.ssjygl.supermarket; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Supermarket; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: supermarket + * Remarks: 销售点(超市) + * PrimaryKey: id + */ +public class SupermarketValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateString("name", 1, 128, "name", "name 长度 1~128"); + validateString("name2", 0, 128, "name2", "name2 长度 0~128"); + + validateBigDecimal("lgtd", new java.math.BigDecimal(74), new java.math.BigDecimal(135), "lgtd", "lgtd 范围 74~135"); + validateBigDecimal("lttd", new java.math.BigDecimal(3.75), new java.math.BigDecimal(53.7), "lttd", "lttd 范围 3.75~53.7"); + validateString("address", 0, 256, "address", "address 长度 0~256"); + validateString("phone", 0, 11, "phone", "phone 长度 0~11"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Supermarket.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistancePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistancePKValidator.java new file mode 100644 index 0000000..c8a0daa --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistancePKValidator.java @@ -0,0 +1,27 @@ +package com.cowr.ssjygl.supermarket.receiverdistance; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.SupermarketReceiverDistance; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: supermarket_receiver_distance + * Remarks: 客户收获地址到每个超市的距离 + * PrimaryKey: supermarket_id,customer_receiver_id + */ +public class SupermarketReceiverDistancePKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647"); + validateRequired("customer_receiver_id", "customer_receiver_id", "customer_receiver_id 必填"); + validateInteger("customer_receiver_id", 1, 2147483647, "customer_receiver_id", "customer_receiver_id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceService.java new file mode 100644 index 0000000..3091f34 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceService.java @@ -0,0 +1,172 @@ +package com.cowr.ssjygl.supermarket.receiverdistance; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Supermarket; +import com.cowr.model.SupermarketReceiverDistance; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: supermarket_receiver_distance + * Remarks: 客户收获地址到每个超市的距离 + * PrimaryKey: supermarket_id,customer_receiver_id + */ +public class SupermarketReceiverDistanceService extends BaseService { + public static final SupermarketReceiverDistanceService me = new SupermarketReceiverDistanceService(); + private static Log log = Log.getLog(SupermarketReceiverDistanceService.class); + + public BigDecimal getDistance(int supermarket_id, int customer_receiver_id) { + try { + return Db.queryBigDecimal("select distance from supermarket_receiver_distance where supermarket_id = ? and customer_receiver_id = ?", supermarket_id, customer_receiver_id); + } catch (Exception e) { + log.error(e.getMessage(), e); + + return new BigDecimal(0); + } + } + + public Page find(PageParam pp, Integer supermarket_id, Integer customer_receiver_id, Integer customer_id) { + String selectsql = "select t.*, s.name supermarket_name, r.address, c.`name` customer_namr "; + String fromsql = "from supermarket_receiver_distance t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join customer_receiver r on r.id = t.customer_receiver_id \n" + + " left join customer c on c.id = r.customer_id \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (customer_id != null) { + fromsql += " and c.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (customer_receiver_id != null) { + fromsql += " and t.customer_receiver_id = ? \n"; + paraList.add(customer_receiver_id); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && SupermarketReceiverDistance.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list(Integer supermarket_id, Integer customer_receiver_id, Integer customer_id) { + List paraList = new ArrayList<>(); + String sql = "select t.*, s.name supermarket_name, r.address, c.`name` customer_namr " + + " from supermarket_receiver_distance t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join customer_receiver r on r.id = t.customer_receiver_id \n" + + " left join customer c on c.id = r.customer_id \n" + + " where 1=1 "; + + if (supermarket_id != null) { + sql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (customer_id != null) { + sql += " and c.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (customer_receiver_id != null) { + sql += " and t.customer_receiver_id = ? \n"; + paraList.add(customer_receiver_id); + } + + return Db.find(sql, paraList.toArray()); + } + + /** + * 列出所超市的 + * + * @param pp + * @param customer_receiver_id + * @param customer_id + * @return + */ + public Record findAllSupermarket(PageParam pp, Integer customer_receiver_id, Integer customer_id) { + List cols = Supermarket.dao.find("select id, name, name2 from supermarket where del = 0"); + String selectsql = "select * "; + String fromsql = "from (select \n" + + " t.*, c.name customer_name\n" + + " , group_concat(sr.supermarket_id order by sr.supermarket_id) supermarket_id\n" + + " , group_concat(sr.distance order by sr.supermarket_id) distance\n" + + " from customer_receiver t\n" + + " left join customer c on t.customer_id = c.id\n" + + " left join supermarket_receiver_distance sr on sr.customer_receiver_id = t.id\n" + + " group by t.id) a \n" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (customer_id != null) { + fromsql += " and a.customer_id = ? \n"; + paraList.add(customer_id); + } + + if (customer_receiver_id != null) { + fromsql += " and a.customer_receiver_id = ? \n"; + paraList.add(customer_receiver_id); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + Page page = Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + List list = page.getList(); + + for (Record record : list) { + if (record.get("supermarket_id") != null) { + String supermarket_arr = record.getStr("supermarket_id"); + String distance_arr = record.getStr("distance"); + + String[] sups = supermarket_arr.split(","); + String[] diss = distance_arr.split(","); + + if (sups.length != diss.length) { + log.error("findAllSupermarket 数据错误"); + continue; + } + + for (int i = 0; i < sups.length; i++) { + String id = sups[i]; + record.set("supermarket_id_" + id, diss[i]); + } + } + } + + Record out = new Record(); + out.set("cols", cols); + out.set("page", page); + + return out; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceValidator.java new file mode 100644 index 0000000..b0bc50d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceValidator.java @@ -0,0 +1,33 @@ +package com.cowr.ssjygl.supermarket.receiverdistance; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.SupermarketReceiverDistance; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: supermarket_receiver_distance + * Remarks: 客户收获地址到每个超市的距离 + * PrimaryKey: supermarket_id,customer_receiver_id + */ +public class SupermarketReceiverDistanceValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateRequired("customer_receiver_id", "customer_receiver_id", "customer_receiver_id 必填"); + validateBigDecimal("distance", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "distance", "distance 范围 0~9.9999999999E10"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistancePKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistancePKValidator.java new file mode 100644 index 0000000..27162c6 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistancePKValidator.java @@ -0,0 +1,27 @@ +package com.cowr.ssjygl.supermarket.sandfarmdistance; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: supermarket_sandfarm_distance + * Remarks: 生产点到销售点的距离配置 + + * PrimaryKey: supermarket_id,sandfarm_id + */ +public class SupermarketSandfarmDistancePKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647"); + validateRequired("sandfarm_id", "sandfarm_id", "sandfarm_id 必填"); + validateInteger("sandfarm_id", 1, 2147483647, "sandfarm_id", "sandfarm_id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceService.java new file mode 100644 index 0000000..d9a4e81 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceService.java @@ -0,0 +1,76 @@ +package com.cowr.ssjygl.supermarket.sandfarmdistance; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.SupermarketSandfarmDistance; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: supermarket_sandfarm_distance + * Remarks: 生产点到销售点的距离配置 + *

+ * PrimaryKey: supermarket_id,sandfarm_id + */ +public class SupermarketSandfarmDistanceService extends BaseService { + public static final SupermarketSandfarmDistanceService me = new SupermarketSandfarmDistanceService(); + private static Log log = Log.getLog(SupermarketSandfarmDistanceService.class); + + public BigDecimal getDistance(int supermarket_id, int sandfarm_id) { + try { + return Db.queryBigDecimal("select distance from supermarket_sandfarm_distance where supermarket_id = ? and sandfarm_id = ?", supermarket_id, sandfarm_id); + } catch (Exception e) { + log.error(e.getMessage(), e); + + return new BigDecimal(0); + } + } + + public Page find(PageParam pp, Integer supermarket_id, Integer sandfarm_id) { + String selectsql = "select t.*, s1.name supermarket_name, s2.name sandfarm_name "; + String fromsql = "from supermarket_sandfarm_distance t \n" + + " left join supermarket s1 on s1.id = t.supermarket_id \n" + + " left join sandfarm s2 on s2.id = t.sandfarm_id" + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if (supermarket_id != null) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (sandfarm_id != null) { + fromsql += " and t.sandfarm_id = ? \n"; + paraList.add(sandfarm_id); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && SupermarketSandfarmDistance.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return SupermarketSandfarmDistance.dao.find("select * from supermarket_sandfarm_distance"); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceValidator.java new file mode 100644 index 0000000..c9e0f47 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceValidator.java @@ -0,0 +1,33 @@ +package com.cowr.ssjygl.supermarket.sandfarmdistance; + +import com.jfinal.core.Controller; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.SupermarketSandfarmDistance; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: supermarket_sandfarm_distance + * Remarks: 生产点到销售点的距离配置 + *

+ * PrimaryKey: supermarket_id,sandfarm_id + */ +public class SupermarketSandfarmDistanceValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateRequired("sandfarm_id", "sandfarm_id", "sandfarm_id 必填"); + validateBigDecimal("distance", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "distance", "distance 范围 0~9.9999999999E10"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockPKValidator.java new file mode 100644 index 0000000..09d41dd --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockPKValidator.java @@ -0,0 +1,24 @@ +package com.cowr.ssjygl.supermarket.stock; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: stock + * Remarks: 订单相关 - 销售点库存量 + * PrimaryKey: supermarket_id + */ +public class StockPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockService.java new file mode 100644 index 0000000..a5c7f0c --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockService.java @@ -0,0 +1,105 @@ +package com.cowr.ssjygl.supermarket.stock; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Stock; +import com.cowr.model.StockModifyLog; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: stock + * Remarks: 订单相关 - 销售点库存量 + * PrimaryKey: supermarket_id + */ +public class StockService extends BaseService { + public static StockService me = new StockService(); + + public Page find(PageParam pp, Integer supermarket_id, Integer product_id) { + String selectsql = "select t.*, s.name supermatker_name, p.name product_name "; + String fromsql = "from stock t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join product p on p.id = t.product_id \n " + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if(supermarket_id != null){ + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if(product_id != null){ + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Stock.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + }else{ + findSql += " order by t.supermarket_id, t.product_id "; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + String sql = "select t.*, s.name supermatker_name, p.name product_name \n " + + " from stock t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join product p on p.id = t.product_id \n "; + return Stock.dao.find(sql); + } + + public Page findlog(PageParam pp, Integer supermarket_id, Integer product_id, String stm, String etm) { + String selectsql = "select t.*, s.name supermatker_name, p.name product_name "; + String fromsql = "from stock_modify_log t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " left join product p on p.id = t.product_id \n " + + " where 1=1 "; + List paraList = new ArrayList<>(); + + if(supermarket_id != null){ + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if(product_id != null){ + fromsql += " and t.product_id = ? \n"; + paraList.add(product_id); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && StockModifyLog.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + }else{ + findSql += " order by t.supermarket_id, t.product_id "; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockValidator.java new file mode 100644 index 0000000..222e39e --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/supermarket/stock/StockValidator.java @@ -0,0 +1,41 @@ +package com.cowr.ssjygl.supermarket.stock; + +import com.jfinal.core.Controller; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Stock; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: stock + * Remarks: 订单相关 - 销售点库存量 + * PrimaryKey: supermarket_id + */ +public class StockValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + + validateInteger("supermarket_id", 1, 2147483647, "supermarket_id", "supermarket_id 范围 1~2147483647"); + } + + validateBigDecimal("stock_weight", new java.math.BigDecimal(-9.9999999999E10), new java.math.BigDecimal(9.9999999999E10), "stock_weight", "stock_weight 范围 -9.9999999999E10~9.9999999999E10"); + + + validateString("change_time", 0, 19, "change_time", "change_time 长度 0~19"); + + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Stock.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserPKValidator.java new file mode 100644 index 0000000..947cc73 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserPKValidator.java @@ -0,0 +1,24 @@ +package com.cowr.ssjygl.system.sysuser; + +import com.jfinal.core.Controller; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; + +/** + * Generated by COWR Tue Jun 25 00:41:56 CST 2019 + * TableName: sysuser + * Remarks: + * PrimaryKey: id + */ +public class SysuserPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserValidator.java new file mode 100644 index 0000000..9745d57 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/system/sysuser/SysuserValidator.java @@ -0,0 +1,54 @@ +package com.cowr.ssjygl.system.sysuser; + +import com.cowr.common.enums.UserTypeEnum; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Sysuser; + +import java.util.List; + +/** + * Generated by COWR Tue Jun 25 00:41:56 CST 2019 + * TableName: sysuser + * Remarks: + * PrimaryKey: id + */ +public class SysuserValidator extends CrudParamValidator { + private static List chktype = UserTypeEnum.getTypeIdArr(); + + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + if ("save".equals(getActionMethodName())) { + validateInIntegerArray("type", chktype, "type", "type 范围 1~4"); + } + + validateRegex("phone", StrUtil.regphone, "phone", "phone 必须为手机号格式"); + validateString("name", 1, 8, "name", "name 长度1~8"); // 必填项,字段长度必须大于0,不能超过最大长度 + + if (StrKit.notBlank(c.get("entity_id"))) { // 可为空字段,当传入值时,才做验证 + validateInteger("entity_id", 1, 2147483647, "entity_id", "entity_id 范围 1~2147483647"); + } + + validateRegex("role", "[0-9]{2,3}", "role", "role 值错误"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Sysuser.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/LicenseValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/LicenseValidator.java new file mode 100644 index 0000000..ecf94b9 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/LicenseValidator.java @@ -0,0 +1,23 @@ +package com.cowr.ssjygl.transport; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; +import com.jfinal.upload.UploadFile; + +public class LicenseValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + try { + c.getFile(); + } catch (Exception ignored) { + + } + validateRequired("truck_license", "truck_license", "truck_license 必填"); + validateString("truck_license", 1, 10, "truck_license", "truck_license 长度 1~10"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/PostWeightValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/PostWeightValidator.java new file mode 100644 index 0000000..d5b158d --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/PostWeightValidator.java @@ -0,0 +1,19 @@ +package com.cowr.ssjygl.transport; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class PostWeightValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("truck_license", "truck_license", "truck_license 必填"); + validateBigDecimal("weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E10), "weight", "weight 范围 0~9.999999999999E10"); + validateRequired("which", "which" ,"which 必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportIdValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportIdValidator.java new file mode 100644 index 0000000..583cff9 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportIdValidator.java @@ -0,0 +1,16 @@ +package com.cowr.ssjygl.transport; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class TransportIdValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("transport_id", "transport_id" ,"transport_id 必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportService.java new file mode 100644 index 0000000..6481fae --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transport/TransportService.java @@ -0,0 +1,175 @@ +package com.cowr.ssjygl.transport; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Supermarket; +import com.cowr.model.Transport; +import com.cowr.model.TransportCompany; +import com.cowr.model.Truck; +import com.cowr.ssjygl.prepay.PrepayService; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: transport + * Remarks: 订单相关 - 出入场记录 + * PrimaryKey: id + */ +public class TransportService extends BaseService { + public static final TransportService me = new TransportService(); + + + /** + * 判断车辆是否在系统中使用过 + * 并且记录是有效的 + * state < 9 + * + * @param license 车辆 + * @return + */ + public Record checkValidLicense(String license) { + if (StrKit.isBlank(license)) { + return null; + } + + // 车辆第一次来时,需要手动创建 transport + return Db.findFirst("select truck_license from transport \n" + + " where state < ?" + + " and truck_license = ? \n" + + " limit 0,1 ", OrderStateEnum.INVALID.getStateid(), license); // 9 + } + + /** + * @param pp 分页参数 + * @param stm 查出场时间 + * @param etm 查出场时间 + * @param truck_license 车牌号 + * @param supermarket_id 超市 + * @param trans_co_id 物流公司,物流公司需要通过绑定的订单去查 + * @return + */ + public Page find(PageParam pp, String order_sn, String stm, String etm, String truck_license, Integer supermarket_id, Integer trans_co_id, Integer state) { + String selectsql = "select t.*, s.name supermarket_name "; + String fromsql = "from transport t \n" + + " left join supermarket s on s.id = t.supermarket_id \n" + + " where 1=1 "; // 只显示未删除的 + List paraList = new ArrayList<>(); + + if (supermarket_id != null && supermarket_id > 0) { + fromsql += " and t.supermarket_id = ? \n"; + paraList.add(supermarket_id); + } + + if (StrKit.notBlank(truck_license)) { + fromsql += " and t.truck_license like ? \n"; + paraList.add("%" + truck_license + "%"); + } + + if (StrKit.notBlank(stm)) { + fromsql += " and t.out_time >= ? \n"; + paraList.add(stm); + } + + if (StrKit.notBlank(etm)) { + fromsql += " and t.out_time <= ? \n"; + paraList.add(etm); + } + + if (trans_co_id != null && trans_co_id > 0) { + fromsql += " and t.trans_co_id = ? \n"; + paraList.add(trans_co_id); + } + + if (StrKit.notBlank(order_sn)) { + fromsql += " and t.order_sn like ? \n"; + paraList.add("%" + order_sn + "%"); + } + + if (state != null) { + fromsql += " and t.state = ? \n"; + paraList.add(state); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Transport.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + }else{ + findSql += " order by t.in_time is null, t.in_time desc "; + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + /** + * 已入场车辆 + * + * @param supermarket_id + * @return + */ + public List inSupermarket(int supermarket_id) { + String sql = " select t.*, t.id transport_id " + + " from transport t \n" + + " where t.state < ? \n" + + " and t.supermarket_id = ? \n" + + " order by t.out_time desc "; + + return Db.find(sql, OrderStateEnum.RECEIVED.getStateid(), supermarket_id); + } + + /** + * 1.第一次来的车辆,需要手动加入 transport, state 设置为 1 + * 2.入场后 state 被置为 2 + * + * @param supermarket_id + * @param truck_license + * @return + */ + public Transport notinTransport(int supermarket_id, String truck_license) { + return Transport.dao.findFirst("select * from transport t \n" + + " where t.state = ? \n" + + " and t.supermarket_id = ? \n" + + " and t.truck_license = ?", + OrderStateEnum.INITIAL.getStateid(), + supermarket_id, + truck_license + ); + } + + /** + * 按超市、车牌号,获取未完成的出入场记录 + * + * @param supermarket_id + * @param truck_license + * @return + */ + public Transport undoneTransport(int supermarket_id, String truck_license) { + return Transport.dao.findFirst("select * from transport t \n" + + " where t.state < ? \n" + + " and t.supermarket_id = ? \n" + + " and t.truck_license = ?", + OrderStateEnum.RECEIVED.getStateid(), // 5 + supermarket_id, + truck_license + ); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyPKValidator.java new file mode 100644 index 0000000..3310d69 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.transportcompany; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.TransportCompany; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: transport_company + * Remarks: 物流公司 + * PrimaryKey: id + */ +public class TransportCompanyPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyService.java new file mode 100644 index 0000000..4169f66 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyService.java @@ -0,0 +1,80 @@ +package com.cowr.ssjygl.transportcompany; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.TransportCompany; +import com.cowr.ssjygl.CacheData; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: transport_company + * Remarks: 物流公司 + * PrimaryKey: id + */ +public class TransportCompanyService extends BaseService { + public static final TransportCompanyService me = new TransportCompanyService(); + private static Log log = Log.getLog(TransportCompanyService.class); + + /** + * 初始化 TRANS_CO_PRICE_MODULUS 配置 + */ + public void initTransCoPriceModulus(){ + CacheData.TRANS_CO_PRICE_MODULUS = new HashMap<>(); + + List list = TransportCompany.dao.find("select id, price_modulus from transport_company"); + + if(list == null || list.isEmpty()){ + log.error("initTransCoPriceModulus 失败"); + return; + } + + for(TransportCompany tp : list){ + CacheData.TRANS_CO_PRICE_MODULUS.put(tp.getId(), tp.getPriceModulus()); + } + } + + public Page find(PageParam pp, String name, Integer del) { + String selectsql = "select * "; + String fromsql = "from transport_company t where 1=1 "; + List paraList = new ArrayList<>(); + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + if(StrKit.notBlank(name)){ + fromsql += " and t.name like ? \n"; + paraList.add("%" + name + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && TransportCompany.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return TransportCompany.dao.find("select * from transport_company t where t.del = 0"); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyValidator.java new file mode 100644 index 0000000..a65a4bb --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transportcompany/TransportCompanyValidator.java @@ -0,0 +1,53 @@ +package com.cowr.ssjygl.transportcompany; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.TransportCompany; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: transport_company + * Remarks: 物流公司 + * PrimaryKey: id + */ +public class TransportCompanyValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateString("name", 1, 128, "name", "name 长度 1~128"); + + if (StrKit.notBlank(c.get("lgtd"))) { // 可为空字段,当传入值时,才做验证 + validateBigDecimal("lgtd", new java.math.BigDecimal(74), new java.math.BigDecimal(135), "lgtd", "lgtd 范围 74~135"); + } + if (StrKit.notBlank(c.get("lttd"))) { // 可为空字段,当传入值时,才做验证 + validateBigDecimal("lttd", new java.math.BigDecimal(3.75), new java.math.BigDecimal(53.7), "lttd", "lttd 范围 3.75~53.7"); + } + + validateString("address", 0, 256, "address", "address 长度 0~256"); + validateString("phone", 0, 11, "phone", "phone 长度 0~11"); + validateString("texpayer_name", 0, 255, "texpayer_name", "texpayer_name 长度 0~255"); + validateString("texpayer_num", 0, 20, "texpayer_num", "texpayer_num 长度 0~20"); + validateString("bank_name", 0, 128, "bank_name", "bank_name 长度 0~128"); + validateString("bank_account", 0, 20, "bank_account", "bank_account 长度 0~20"); + validateString("memo", 0, 256, "memo", "memo 长度 0~256"); + validateBigDecimal("price_modulus", new java.math.BigDecimal(0), new java.math.BigDecimal(1), "price_modulus", "price_modulus 范围 0~1"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/CaleTransPriceValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/CaleTransPriceValidator.java new file mode 100644 index 0000000..a23a43f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/CaleTransPriceValidator.java @@ -0,0 +1,18 @@ +package com.cowr.ssjygl.transprice; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class CaleTransPriceValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateBigDecimal("weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E10), "weight", "weight 范围 0~9.999999999999E10"); + validateBigDecimal("trans_distance", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E12), "trans_distance", "trans_distance 范围 0~9.999999999999E12"); + } + + @Override + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceController.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceController.java new file mode 100644 index 0000000..61e1d6f --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceController.java @@ -0,0 +1,45 @@ +package com.cowr.ssjygl.transprice; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.Result; + +public class TransPriceController extends BaseController { + /** + * 销售或者转运运费计算 + */ + public void caleTransPrice() { + int type = getInt("type", 1); + Integer trans_co_id = getInt("trans_co_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + double weight = getParaToDouble("weight", 0.0); + double trans_distance = getParaToDouble("trans_distance", 0.0); + + if(type == 1){ + renderJson(Result.success(TransPriceService.me.caleOrderTransPrice(trans_co_id, weight, trans_distance))); + }else{ + renderJson(Result.success(TransPriceService.me.caleTransferTransPrice(sandfarm_id, weight, trans_distance))); + } + } + + /** + * 销售订单运费计算 + */ + public void caleOrderTransPrice() { + Integer trans_co_id = getInt("trans_co_id"); + double weight = getParaToDouble("weight", 0.0); + double trans_distance = getParaToDouble("trans_distance", 0.0); + + renderJson(Result.success(TransPriceService.me.caleOrderTransPrice(trans_co_id, weight, trans_distance))); + } + + /** + * 转运订单运费计算 + */ + public void caleTransfTransPrice() { + Integer sandfarm_id = getInt("sandfarm_id"); + double weight = getParaToDouble("weight", 0.0); + double trans_distance = getParaToDouble("trans_distance", 0.0); + + renderJson(Result.success(TransPriceService.me.caleTransferTransPrice(sandfarm_id, weight, trans_distance))); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceModel.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceModel.java new file mode 100644 index 0000000..7860f73 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceModel.java @@ -0,0 +1,72 @@ +package com.cowr.ssjygl.transprice; + +import com.alibaba.fastjson.annotation.JSONField; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Record; + +/** + * { + * min: 5, 重量范围下限 + * max: 5, 重量范围上限 + * start: 46.5, 重量范围内,起步运距内的起步单价 + * unit_price: 0.47 重量范围内,每公里每吨运费 + * } + */ +public class TransPriceModel { + private static Log log = Log.getLog(TransPriceModel.class); + private double min; + private double max; + private double start; + private double unit_price; + + public TransPriceModel(Record model){ + try{ + this.min = model.getBigDecimal("min").doubleValue(); + this.max = model.getBigDecimal("max").doubleValue(); + this.start = model.getBigDecimal("start").doubleValue(); + this.unit_price = model.getBigDecimal("unit_price").doubleValue(); + }catch (Exception e){ + log.error(e.getMessage(), e); + } + } + + @JSONField(name="min") + public double getMin() { + return min; + } + + @JSONField(name="min") + public void setMin(double min) { + this.min = min; + } + + @JSONField(name="max") + public double getMax() { + return max; + } + + @JSONField(name="max") + public void setMax(double max) { + this.max = max; + } + + @JSONField(name="start") + public double getStart() { + return start; + } + + @JSONField(name="start") + public void setStart(double start) { + this.start = start; + } + + @JSONField(name="unit_price") + public double getUnitPrice() { + return unit_price; + } + + @JSONField(name="unit_price") + public void setUnitPrice(double unit_price) { + this.unit_price = unit_price; + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceService.java new file mode 100644 index 0000000..6fb5b16 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/transprice/TransPriceService.java @@ -0,0 +1,320 @@ +package com.cowr.ssjygl.transprice; + +import com.cowr.common.Const; +import com.cowr.common.utils.MathUtil; +import com.cowr.model.Sandfarm; +import com.cowr.model.TransPriceConfigSale; +import com.cowr.model.TransPriceConfigTransfer; +import com.cowr.model.TransPriceConfigTrash; +import com.cowr.ssjygl.CacheData; +import com.jfinal.log.Log; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +public class TransPriceService { + private static Log log = Log.getLog(TransPriceService.class); + public static TransPriceService me = new TransPriceService(); + + /** + * 初始化销售订单运输价格配置 + */ + public void initTransPriceConfigSale(){ + CacheData.TRANS_PRICE_CONFIG_SALE = new ArrayList<>(); + // 默认 order by id ,数据库中配置的值,必须是固定的,都不能动 + List list = TransPriceConfigSale.dao.find("select * from trans_price_config_sale order by id"); + + if(list == null || list.isEmpty()){ + log.error("initOrderTransPriceConfig 失败"); + return; + } + + for(TransPriceConfigSale tc : list){ + CacheData.TRANS_PRICE_CONFIG_SALE.add(new TransPriceModel(tc.toRecord())); + } + } + + /** + * 初始化转运订单运输价格配置 + */ + public void initTransPriceConfigTransfer(){ + CacheData.TRANS_PRICE_CONFIG_TRANSFER = new ArrayList<>(); + // 默认 order by id ,数据库中配置的值,必须是固定的,都不能动 + List list = TransPriceConfigTransfer.dao.find("select * from trans_price_config_transfer order by id"); + + if(list == null || list.isEmpty()){ + log.error("initTransferTransPriceConfig 失败"); + return; + } + + for(TransPriceConfigTransfer tc : list){ + CacheData.TRANS_PRICE_CONFIG_TRANSFER.add(new TransPriceModel(tc.toRecord())); + } + } + + /** + * 初始化废料订单运输价格配置 + */ + public void initTransPriceConfigTrash(){ + CacheData.TRANS_PRICE_CONFIG_TRASH = new ArrayList<>(); + // 默认 order by id ,数据库中配置的值,必须是固定的,都不能动 + List list = TransPriceConfigTrash.dao.find("select * from trans_price_config_trash order by id"); + + if(list == null || list.isEmpty()){ + log.error("initTransPriceConfigTrash 失败"); + return; + } + + for(TransPriceConfigTrash tc : list){ + CacheData.TRANS_PRICE_CONFIG_TRASH.add(new TransPriceModel(tc.toRecord())); + } + } + + /** + * 计算总价,三舍四入 保留 0 位小数 + * @param up 单价 + * @param net_weight 净重 + * @return Double + */ + public Double caleTotalPriceDouble(BigDecimal up, BigDecimal net_weight){ + if(up == null || net_weight == null){ + return null; + } + +// return MathUtil.round4(up.multiply(net_weight).doubleValue()); // 三舍四入 保留 0 位小数 + // 2020-07-01 保留两位小数 + return up.multiply(net_weight).setScale(2, BigDecimal.ROUND_UP).doubleValue(); + } + + /** + * 计算总价 + * @param up + * @param net_weight + * @return BigDecimal + */ + public BigDecimal caleTotalPrice(BigDecimal up, BigDecimal net_weight){ + if(up == null || net_weight == null){ + return null; + } + + return new BigDecimal(caleTotalPriceDouble(up, net_weight)); + } + + /** + * 计算销售订单运输总价 + * @param trans_co_id 物流公司id + * @param net_weight 净重 + * @param trans_distance 运输距离 + * @return + */ + public double caleOrderTransPrice(Integer trans_co_id, double net_weight, double trans_distance){ + return caleTransPrice(CacheData.TRANS_PRICE_CONFIG_SALE, trans_co_id, net_weight, trans_distance); + } + + /** + * 计算转运订单运输总价 + * 2019-08-31 转运运费改为以距离为基础,分段计价 + * @param sandfarm_id 砂场id + * @param net_weight 净重 + * @param trans_distance 运输距离 + * @return + */ + public double caleTransferTransPrice(Integer sandfarm_id, double net_weight, double trans_distance){ + if (CacheData.TRANS_PRICE_CONFIG_TRANSFER == null || CacheData.TRANS_PRICE_CONFIG_TRANSFER.isEmpty()) { + log.error("读取运费配置错误"); + return 0.0; + } + + // 2019-09-01 砂场信息是用户可能会添加的,为了方便,还是每次从数据取 + Sandfarm sandfarm = Sandfarm.dao.findById(sandfarm_id); + + if(sandfarm == null){ + log.error("获取砂场信息错误"); + return 0.0; + } + + BigDecimal offset = sandfarm.getOffset(); + + if (offset == null) { + log.error("物流公司价格系数错误"); + offset = new BigDecimal(0); + } + + TransPriceModel first = CacheData.TRANS_PRICE_CONFIG_TRANSFER.get(0); + + // 直接使用起始运距 + if (trans_distance < first.getMin()) { + trans_distance = first.getMin(); // 起步运距 + } + + trans_distance = Double.valueOf(trans_distance).intValue(); // 保留小数 + double out = 0.0; + + if (trans_distance < first.getMin()) { + out = (first.getStart() + first.getUnitPrice() * (trans_distance - first.getMin()) + offset.doubleValue()) * net_weight; + } else { + for (TransPriceModel model : CacheData.TRANS_PRICE_CONFIG_TRANSFER) { + if (model.getMin() != model.getMax()) { + if (trans_distance > model.getMin() && trans_distance < model.getMax()) { + out = (model.getStart() + model.getUnitPrice() * (trans_distance - model.getMin()) + offset.doubleValue()) * net_weight; + } + } else if (trans_distance == model.getMin()) { + out = (model.getStart() + model.getUnitPrice() * (trans_distance - model.getMin()) + offset.doubleValue()) * net_weight; + } + } + } + + + // 20190-08-06 四舍五入,保留 0 位小数 + // 20190-08-09 三舍四入,保留 0 位小数 + return MathUtil.round4(out); + } + + /** + * 根据重量计算运费 + * + * @param net_weight 货物净重重量 + * @param trans_distance 运输距离 + * @return + */ + public double caleTransPrice(List tps, Integer trans_co_id, double net_weight, double trans_distance) { + if (CacheData.start_trans_distance == null) { + log.error("读取运费起步运距错误"); + return 0.0; + } + + if (tps == null || tps.isEmpty()) { + log.error("读取运费配置错误"); + return 0.0; + } + + if (CacheData.TRANS_CO_PRICE_MODULUS == null || !CacheData.TRANS_CO_PRICE_MODULUS.containsKey(trans_co_id)) { + log.error("物流公司价格系数错误"); + return 0.0; + } + + BigDecimal price_modulus = CacheData.TRANS_CO_PRICE_MODULUS.get(trans_co_id); + + if (price_modulus == null) { + log.error("物流公司价格系数错误"); + price_modulus = new BigDecimal(1); + } + + // 直接使用起始运距 + if (trans_distance < CacheData.start_trans_distance) { + trans_distance = CacheData.start_trans_distance; // 起步运距 + } + + TransPriceModel first = tps.get(0); + double temp_trans_distance = trans_distance - CacheData.start_trans_distance; + double out = 0.0; + + if (net_weight < first.getMin()) { + net_weight = first.getMin(); // 起步重量 + out = first.getStart() + first.getUnitPrice() * temp_trans_distance * net_weight; + } else { + for (TransPriceModel model : tps) { + if (model.getMin() != model.getMax()) { + if (net_weight > model.getMin() && net_weight < model.getMax()) { + out = model.getStart() + model.getUnitPrice() * temp_trans_distance * net_weight; + } + } else if (net_weight == model.getMin()) { + out = model.getStart() + model.getUnitPrice() * temp_trans_distance * net_weight; + } + } + } + + + // 20190-08-06 四舍五入,保留 0 位小数 + // 20190-08-09 三舍四入,保留 0 位小数 + return MathUtil.round4(out * price_modulus.doubleValue() ); + } + + /** + * 销售订单起步价 + * @param trans_co_id + * @param weight + * @return + */ + public double getOrderStartTransPrice(Integer trans_co_id, double weight){ + return getStartTransPrice(CacheData.TRANS_PRICE_CONFIG_SALE, trans_co_id, weight); + } + + /** + * 转运订单单价 + * @return + */ + public double getTransferStartTransPrice(double trans_distance){ + if (CacheData.TRANS_PRICE_CONFIG_TRANSFER == null || CacheData.TRANS_PRICE_CONFIG_TRANSFER.isEmpty()) { + log.error("读取运费配置错误"); + return 0.0; + } + + TransPriceModel first = CacheData.TRANS_PRICE_CONFIG_TRANSFER.get(0); + + if (trans_distance < first.getMin()) { + return first.getStart(); + } + + trans_distance = Double.valueOf(trans_distance).intValue(); // 保留小数 + double out = 0.0; + + for (TransPriceModel model : CacheData.TRANS_PRICE_CONFIG_TRANSFER) { + if (model.getMin() != model.getMax()) { + if (trans_distance > model.getMin() && trans_distance < model.getMax()) { + out = model.getStart() + model.getUnitPrice() * (trans_distance - model.getMin()); + } + } else if (trans_distance == model.getMin()) { + out = model.getStart() + model.getUnitPrice() * (trans_distance - model.getMin()); + } + } + + return out; + } + + /** + * 按重量返回对应的起步价格 + * + * @param weight + * @return + */ + public double getStartTransPrice(List tps, Integer trans_co_id, double weight) { + if (tps == null || tps.isEmpty()) { + log.error("读取运费配置错误"); + return 0.0; + } + + if (CacheData.TRANS_CO_PRICE_MODULUS == null || !CacheData.TRANS_CO_PRICE_MODULUS.containsKey(trans_co_id)) { + log.error("物流公司价格系数错误"); + return 0.0; + } + + BigDecimal price_modulus = CacheData.TRANS_CO_PRICE_MODULUS.get(trans_co_id); + + if (price_modulus == null) { + log.error("物流公司价格系数错误"); + price_modulus = new BigDecimal(1); + } + + TransPriceModel first = tps.get(0); + + if (weight < first.getMin()) { + return first.getStart() * price_modulus.doubleValue(); + } + + double out = 0.0; + + for (TransPriceModel model : tps) { + if (model.getMin() != model.getMax()) { + if (weight > model.getMin() && weight < model.getMax()) { + out = model.getStart(); + } + } else if (weight == model.getMin()) { + out = model.getStart(); + } + } + + return out * price_modulus.doubleValue(); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckPKValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckPKValidator.java new file mode 100644 index 0000000..0c492f5 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckPKValidator.java @@ -0,0 +1,25 @@ +package com.cowr.ssjygl.truck; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Truck; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: truck + * Remarks: 运输车辆信息 + * PrimaryKey: license + */ +public class TruckPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("license", "license", "license 必填"); + validateString("license", 1, 10, "license", "license 长度 1~10"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckService.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckService.java new file mode 100644 index 0000000..98d7a5b --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckService.java @@ -0,0 +1,106 @@ +package com.cowr.ssjygl.truck; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.Truck; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: truck + * Remarks: 运输车辆信息 + * PrimaryKey: license + */ +public class TruckService extends BaseService { + public static final TruckService me = new TruckService(); + + public Page find(PageParam pp, String license, Integer trans_co_id, Integer state, String gps, String sim, Integer del, String number) { + String selectsql = "select * "; + String fromsql = "from truck t where 1=1 "; + List paraList = new ArrayList<>(); + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + fromsql += " and t.del = ? \n"; + paraList.add(del); + } + + if (StrKit.notBlank(license)) { + fromsql += " and t.license like ? \n"; + paraList.add("%" + license + "%"); + } + + if (trans_co_id != null) { + fromsql += " and t.trans_co_id = ? \n"; + paraList.add(trans_co_id); + } + + if (state != null) { + fromsql += " and t.state = ? \n"; + paraList.add(state); + } + + if (StrKit.notBlank(gps)) { + fromsql += " and t.gps like ? \n"; + paraList.add("%" + gps + "%"); + } + + if (StrKit.notBlank(sim)) { + fromsql += " and t.sim like ? \n"; + paraList.add("%" + sim + "%"); + } + + if (StrKit.notBlank(number)) { + fromsql += " and t.number like ? \n"; + paraList.add("%" + number + "%"); + } + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && Truck.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return Truck.dao.find("select * from truck"); + } + + /** + * 计算判定皮重 + * 判定车辆目前的订单类型 + * 如果有销售订单,则先称重。如果车辆入场重量大大超过皮重(>=10%),则认为是转运车辆 + * 如果车辆入场重量在皮重左右(<10%),则认为是执行销售订单 + * @param tare + * @return 皮重 * ( 1 + 浮动参数 ) + */ + public Double getTareDistinguish(Double weight_distinguish, BigDecimal tare) { + if (tare == null || tare.doubleValue() < 0) { + return null; + } + + if (weight_distinguish == null) { + return null; + } + + return Math.abs(tare.multiply(new BigDecimal(1 + weight_distinguish)).setScale(2, RoundingMode.HALF_UP).doubleValue()); + } +} diff --git a/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckValidator.java b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckValidator.java new file mode 100644 index 0000000..461f156 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/com/cowr/ssjygl/truck/TruckValidator.java @@ -0,0 +1,51 @@ +package com.cowr.ssjygl.truck; + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Truck; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: truck + * Remarks: 运输车辆信息 + * PrimaryKey: license + */ +public class TruckValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("license", "license", "license 必填"); + validateString("license", 1, 10, "license", "license 长度 1~10"); + } + + validateInteger("trans_co_id", 1, 2147483647, "trans_co_id", "trans_co_id 范围 1~2147483647"); + validateBigDecimal("capacity", new java.math.BigDecimal(0), new java.math.BigDecimal(9.99999999E8), "capacity", "capacity 范围 0~9.99999999E8"); + validateString("memo", 0, 256, "memo", "memo 长度 0~256"); + validateBigDecimal("tare", new java.math.BigDecimal(0), new java.math.BigDecimal(9.99999999E8), "tare", "tare 范围 0~9.99999999E8"); + validateString("model", 0, 32, "model", "model 长度 0~32"); + + if (StrKit.notBlank(c.get("number"))) { // 可为空字段,当传入值时,才做验证 + validateString("number", 0, 4, "number", "number 范围 0~9999"); + } + + validateString("owner_name", 0, 8, "owner_name", "owner_name 长度 0~8"); + validateString("owner_phone", 0, 11, "owner_phone", "owner_phone 长度 0~11"); + validateString("gps", 0, 32, "gps", "gps 长度 0~32"); + validateString("sim", 0, 32, "sim", "sim 长度 0~32"); + + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Truck.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/java/generator/BaseModelGenerator.java b/ssjygl-xsx-common/src/main/java/generator/BaseModelGenerator.java new file mode 100644 index 0000000..9e125b2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/BaseModelGenerator.java @@ -0,0 +1,170 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package generator; + +import com.jfinal.kit.JavaKeyword; +import com.jfinal.kit.Kv; +import com.jfinal.kit.StrKit; +import com.jfinal.template.Engine; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Base model 生成器 + */ +public class BaseModelGenerator { + + protected Engine engine; + protected String template = "/generator/base_model_template.jf"; + + protected String baseModelPackageName; + protected String baseModelOutputDir; + protected boolean generateChainSetter = false; + + protected JavaKeyword javaKeyword = JavaKeyword.me; + + /** + * 针对 Model 中七种可以自动转换类型的 getter 方法,调用其具有确定类型返回值的 getter 方法 + * 享用自动类型转换的便利性,例如 getInt(String)、getStr(String) + * 其它方法使用泛型返回值方法: get(String) + * 注意:jfinal 3.2 及以上版本 Model 中的六种 getter 方法才具有类型转换功能 + */ + @SuppressWarnings("serial") + protected Map getterTypeMap = new HashMap() {{ + put("java.lang.String", "getStr"); + put("java.lang.Integer", "getInt"); + put("java.lang.Long", "getLong"); + put("java.lang.Double", "getDouble"); + put("java.lang.Float", "getFloat"); + put("java.lang.Short", "getShort"); + put("java.lang.Byte", "getByte"); + }}; + + public BaseModelGenerator(String baseModelPackageName, String baseModelOutputDir) { + if (StrKit.isBlank(baseModelPackageName)) { + throw new IllegalArgumentException("baseModelPackageName can not be blank."); + } + if (baseModelPackageName.contains("/") || baseModelPackageName.contains("\\")) { + throw new IllegalArgumentException("baseModelPackageName error : " + baseModelPackageName); + } + if (StrKit.isBlank(baseModelOutputDir)) { + throw new IllegalArgumentException("baseModelOutputDir can not be blank."); + } + + this.baseModelPackageName = baseModelPackageName; + this.baseModelOutputDir = baseModelOutputDir; + + initEngine(); + } + + protected void initEngine() { + engine = new Engine(); + engine.setToClassPathSourceFactory(); // 从 class path 内读模板文件 + engine.addSharedMethod(new StrKit()); + engine.addSharedObject("getterTypeMap", getterTypeMap); + engine.addSharedObject("javaKeyword", javaKeyword); + } + + /** + * 使用自定义模板生成 base model + */ + public void setTemplate(String template) { + this.template = template; + } + + public void setGenerateChainSetter(boolean generateChainSetter) { + this.generateChainSetter = generateChainSetter; + } + + public void generate(List tableMetas) { + System.out.println("Generate base model ..."); + System.out.println("Base Model Output Dir: " + baseModelOutputDir); + + for (TableMeta tableMeta : tableMetas) { + genBaseModelContent(tableMeta); + } + writeToFile(tableMetas); + } + + protected void genBaseModelContent(TableMeta tableMeta) { + Kv data = Kv.by("baseModelPackageName", baseModelPackageName); + data.set("generateChainSetter", generateChainSetter); + data.set("tableMeta", tableMeta); + data.set("nowtime", new Date()); + + tableMeta.baseModelContent = engine.getTemplate(template).renderToString(data); + } + + protected void writeToFile(List tableMetas) { + try { + for (TableMeta tableMeta : tableMetas) { + writeToFile(tableMeta); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * base model 不覆盖 + */ + protected void writeToFile(TableMeta tableMeta) throws IOException { + File dir = new File(baseModelOutputDir); + if (!dir.exists()) { + dir.mkdirs(); + } + + String target = baseModelOutputDir + File.separator + tableMeta.baseModelName + ".java"; + + File file = new File(target); + if (file.exists()) { + return ; // 若存在,不覆盖 + } + + OutputStreamWriter osw = null; + try { + osw = new OutputStreamWriter(new FileOutputStream(target), "UTF-8"); + osw.write(tableMeta.baseModelContent); + } + finally { + if (osw != null) { + osw.close(); + } + } + } + + public String getBaseModelPackageName() { + return baseModelPackageName; + } + + public String getBaseModelOutputDir() { + return baseModelOutputDir; + } +} + + + + + + diff --git a/ssjygl-xsx-common/src/main/java/generator/ColumnMeta.java b/ssjygl-xsx-common/src/main/java/generator/ColumnMeta.java new file mode 100644 index 0000000..2ac62dc --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/ColumnMeta.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package generator; + +import java.io.Serializable; + +/** + * ColumnMeta + */ +@SuppressWarnings("serial") +public class ColumnMeta implements Serializable { + + public String name; // 字段名 + public String javaType; // 字段对应的 java 类型 + public String shortJavaType; // 字段对应的 java 类型 + public String attrName; // 字段对应的属性名 + + // --------- + + /* + -----------+---------+------+-----+---------+---------------- + Field | Type | Null | Key | Default | Remarks + -----------+---------+------+-----+---------+---------------- + id | int(11) | NO | PRI | NULL | remarks here + */ + public String type; // 字段类型(附带字段长度与小数点),例如:decimal(11,2) + public String isNullable; // 是否允许空值 + public String isPrimaryKey; // 是否主键 + public String defaultValue; // 默认值 + public String remarks; // 字段备注 + + public long columnSize; // 字段总长度 + public int decimalDigits; // 字段小数位长度 + public Object min; // 最小值 // 最小长度 + public Object max; // 最大值 // 最大长度 + public String descstr; // 描述字符串 + + public String validate; // 验证字符串 +} + diff --git a/ssjygl-xsx-common/src/main/java/generator/CrudGenerator.java b/ssjygl-xsx-common/src/main/java/generator/CrudGenerator.java new file mode 100644 index 0000000..99ad1aa --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/CrudGenerator.java @@ -0,0 +1,128 @@ +package generator; + +import com.jfinal.kit.Kv; +import com.jfinal.kit.StrKit; +import com.jfinal.template.Engine; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Date; +import java.util.List; + +public class CrudGenerator { + protected Engine engine; + + protected String modelPackageName; + protected String packageName; + protected String outputDir; + protected String suffix; + protected String template; + + public CrudGenerator(String modelPackageName, String packageName, String outputDir, String suffix) { + if (StrKit.isBlank(modelPackageName)) { + throw new IllegalArgumentException("modelPackageName can not be blank."); + } + if (modelPackageName.contains("/") || modelPackageName.contains("\\")) { + throw new IllegalArgumentException("modelPackageName error : " + modelPackageName); + } + if (StrKit.isBlank(packageName)) { + throw new IllegalArgumentException("controllerPackageName can not be blank."); + } + if (StrKit.isBlank(outputDir)) { + throw new IllegalArgumentException("outputDir can not be blank."); + } + if (StrKit.isBlank(suffix)) { + throw new IllegalArgumentException("suffix can not be blank."); + } + + this.modelPackageName = modelPackageName; + this.outputDir = outputDir; + this.packageName = packageName; + this.suffix = suffix; + + this.template = "/generator/" + this.suffix.toLowerCase() + "_template.jf"; + + initEngine(); + } + + protected void initEngine() { + engine = new Engine(); + engine.setToClassPathSourceFactory(); + engine.addSharedMethod(new StrKit()); + } + /** + * 使用自定义模板生成 model + */ + public void setTemplate(String template) { + this.template = template; + } + + + public void generate(List tableMetas) { + System.out.println("Generate controller ..."); + System.out.println("controller Output Dir: " + outputDir); + + for (TableMeta tableMeta : tableMetas) { + genModelContent(tableMeta); + } + writeToFile(tableMetas); + } + + + + protected void genModelContent(TableMeta tableMeta) { + Kv data = Kv.by("modelPackageName", modelPackageName); + data.set("packageName", packageName); + data.set("tableMeta", tableMeta); + data.set("suffix", suffix); + data.set("nowtime", new Date()); + + String ret = engine.getTemplate(template).renderToString(data); + tableMeta.modelContent = ret; + } + + protected void writeToFile(List tableMetas) { + try { + for (TableMeta tableMeta : tableMetas) { + writeToFile(tableMeta); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 若文件存在,则不生成,以免覆盖用户手写的代码 + */ + protected void writeToFile(TableMeta tableMeta) throws IOException { + File dir = new File(outputDir); + if (!dir.exists()) { + dir.mkdirs(); + } + + dir = new File(outputDir + File.separator + tableMeta.modelName.toLowerCase()); + if (!dir.exists()) { + dir.mkdirs(); + } + + String target = outputDir + File.separator + tableMeta.modelName.toLowerCase() + File.separator + tableMeta.modelName + this.suffix + ".java"; + + File file = new File(target); + if (file.exists()) { + return ; // 若存在,不覆盖 + } + + OutputStreamWriter osw = null; + try { + osw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); + osw.write(tableMeta.modelContent); + } + finally { + if (osw != null) { + osw.close(); + } + } + } +} diff --git a/ssjygl-xsx-common/src/main/java/generator/DataDictionaryGenerator.java b/ssjygl-xsx-common/src/main/java/generator/DataDictionaryGenerator.java new file mode 100644 index 0000000..5a20252 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/DataDictionaryGenerator.java @@ -0,0 +1,202 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package generator; + +import com.jfinal.kit.LogKit; +import com.jfinal.kit.StrKit; +import org.apache.poi.xwpf.usermodel.*; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.util.List; + +/** + * DataDictionary 数据字典生成器 + */ +public class DataDictionaryGenerator { + + protected String dataDictionaryOutputDir; + protected String dataDictionaryFileName = "DataDictionary.docx"; + + public DataDictionaryGenerator(String dataDictionaryOutputDir) { + this.dataDictionaryOutputDir = dataDictionaryOutputDir; + } + + public void setDataDictionaryOutputDir(String dataDictionaryOutputDir) { + if (StrKit.notBlank(dataDictionaryOutputDir)) { + this.dataDictionaryOutputDir = dataDictionaryOutputDir; + } + } + + public String getDataDictionaryOutputDir() { + return dataDictionaryOutputDir; + } + + public void setDataDictionaryFileName(String dataDictionaryFileName) { + if (StrKit.notBlank(dataDictionaryFileName)) { + this.dataDictionaryFileName = dataDictionaryFileName; + } + } + + public String getDataDictionaryFileName() { + return dataDictionaryFileName; + } + + public void generate(List tableMetas) { + System.out.println("Generate DataDictionary file ..."); + System.out.println("Data Dictionary Output Dir: " + dataDictionaryOutputDir); + + XWPFDocument doc = new XWPFDocument(); + addCustomHeadingStyle(doc, "标题 1", 1); + + for(int i=0; i style is more prominent in the formats bar + ctStyle.setUiPriority(indentNumber); + + CTOnOff onoffnull = CTOnOff.Factory.newInstance(); + ctStyle.setUnhideWhenUsed(onoffnull); + + // style shows up in the formats bar + ctStyle.setQFormat(onoffnull); + + // style defines a heading of the given level + CTPPr ppr = CTPPr.Factory.newInstance(); + ppr.setOutlineLvl(indentNumber); + ctStyle.setPPr(ppr); + + XWPFStyle style = new XWPFStyle(ctStyle); + + // is a null op if already defined + XWPFStyles styles = docxDocument.createStyles(); + + style.setType(STStyleType.PARAGRAPH); + styles.addStyle(style); + } + + + /* + -----------+---------+------+-----+---------+---------------- + Field | Type | Null | Key | Default | Remarks + -----------+---------+------+-----+---------+---------------- + id | int(11) | NO | PRI | NULL | remarks here + */ + + protected void genTableHead(XWPFDocument doc, List cms){ + XWPFTable table = doc.createTable(cms.size() + 1, 6); + + // 表头 + XWPFTableRow row = table.getRow(0); + setCell(row, 0, "字段"); + setCell(row, 1, "类型"); + setCell(row, 2, "是否可为空"); + setCell(row, 3, "是否主键"); + setCell(row, 4, "默认值"); + setCell(row, 5, "描述"); + + for(int i=0; i tableMetas = metaBuilder.build(); + if (tableMetas.size() == 0) { + System.out.println("TableMeta 数量为 0,不生成任何文件"); + return ; + } + + baseModelGenerator.generate(tableMetas); + + if (modelGenerator != null) { + modelGenerator.generate(tableMetas); + } + + if (mappingKitGenerator != null) { + mappingKitGenerator.generate(tableMetas); + } + + if (dataDictionaryGenerator != null && generateDataDictionary) { + dataDictionaryGenerator.generate(tableMetas); + } + + long usedTime = (System.currentTimeMillis() - start) / 1000; + System.out.println("Generate complete in " + usedTime + " seconds."); + } +} + + + diff --git a/ssjygl-xsx-common/src/main/java/generator/Main.java b/ssjygl-xsx-common/src/main/java/generator/Main.java new file mode 100644 index 0000000..65482c3 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/Main.java @@ -0,0 +1,108 @@ +package generator; + +import com.jfinal.kit.PathKit; +import com.jfinal.kit.PropKit; +import com.jfinal.plugin.druid.DruidPlugin; + +import javax.sql.DataSource; +import java.util.Comparator; +import java.util.List; + +public class Main { + public static class TableMetaComparator implements Comparator { + @Override + public int compare(Object o1, Object o2) { + TableMeta tm1 = (TableMeta) o1; + TableMeta tm2 = (TableMeta) o2; + + return tm1.remarks.compareTo(tm2.remarks); + } + } + + public static void main(String[] args) { + // 此处填入需要生成model的表 + // 仅保留本次处理需要的表,不需要的就 + String[] tableArray = { + "transport", + "driver", + "product", + "order_temp", + "customer", + "customer_receiver", + "supermarket_receiver_distance", + "customer_contact", + "prepay_customer", + "prepay_detail", + "prepay_detail_state_history", + "refund_detail", + "refund_detail_state_history", + "order_trash", + "trans_price_config_trash", + "stock_modify_log", + "transport_company", + "supermarket_sandfarm_distance", + "sandfarm", + "action_cmd_log", + "sysuser", + "cctv", + "cctv_channels", + "ordercluster", + "supermarket_product", + "blacklist", + "order_transfer", + "trans_price_config_transfer", + "truck", + "modify_log", + "order_purchase", + "purchase", + "order_sale", + "stock", + "supermarket", + "trans_price_config_sale", + "prepay_truck", + "sync_task", + "order_seq", + "auth_license", + "device_config", + "bocomm", + "bocomm_request", + "bocomm_response", + }; + + PropKit.use("db.properties"); + + String baseModelPkg = "com.cowr.model.base"; // base model 所使用的包名 + String baseModelDir = PathKit.getWebRootPath() + "/../gern/model/base"; // base model 文件保存路径 + String modelPkg = "com.cowr.model"; // model 所使用的包名 + String modelDir = baseModelDir + "/.."; // model 文件保存路径 + + // 在 jdbc 连接 url 字符串中添加 useInformationSchema=true 这个参数,才能通过 Connection 直接获取表的描述 + DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim()); + dp.start(); + DataSource ds = dp.getDataSource(); + MetaBuilder mb = new MetaBuilder(ds); + + mb.setTableArray(tableArray); + mb.setComparator(new TableMetaComparator()); + + Generator generator = new Generator(ds, baseModelPkg, baseModelDir, modelPkg, modelDir); + generator.setGenerateDaoInModel(true); // 在model中添加 dao 实例 + generator.setMetaBuilder(mb); + + generator.setGenerateDataDictionary(true); // 生成数据字典 + generator.generate(); + + // 仅生成 basemodel 和 model 时把下面的要注释掉 + String dir = baseModelDir + "/../.."; // crud 文件保存路径 + String pkg = "com.cowr.hsjygl"; + List tm = mb.build(); + // 在 controller 中,将 getModel 的 skipConvertError 设置为了 true + // 这样,在 geModel 时遇到不在 model 中的字段时会跳过 + // 目前存在一个隐患,当解析 model 中存在的字段时,遇到错误也会跳过,导致 model 在操作数据库时可能会存在问题 + // 比如没有做适当的参数合法校验时,传一个错误的时间格式,getModel 时不会转换这个时间字段,也不会用对应的错误提示 + new CrudGenerator(modelPkg, pkg, dir, "Controller").generate(tm); // 生成 Controller + new CrudGenerator(modelPkg, pkg, dir, "Service").generate(tm); // 生成 Service + new CrudGenerator(modelPkg, pkg, dir, "Validator").generate(tm); // 生成 Validator + new CrudGenerator(modelPkg, pkg, dir, "PKValidator").generate(tm); // 生成 PKValidator + } +} diff --git a/ssjygl-xsx-common/src/main/java/generator/MappingKitGenerator.java b/ssjygl-xsx-common/src/main/java/generator/MappingKitGenerator.java new file mode 100644 index 0000000..84ee302 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/MappingKitGenerator.java @@ -0,0 +1,135 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package generator; + +import com.jfinal.kit.Kv; +import com.jfinal.kit.LogKit; +import com.jfinal.kit.StrKit; +import com.jfinal.template.Engine; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Date; +import java.util.List; + +/** + * MappingKit 文件生成器 + */ +public class MappingKitGenerator { + + protected Engine engine; + protected String template = "/generator/mapping_kit_template.jf"; + + protected String mappingKitPackageName; + protected String mappingKitOutputDir; + protected String mappingKitClassName = "_MappingKit"; + + public MappingKitGenerator(String mappingKitPackageName, String mappingKitOutputDir) { + this.mappingKitPackageName = mappingKitPackageName; + this.mappingKitOutputDir = mappingKitOutputDir; + + initEngine(); + } + + protected void initEngine() { + engine = new Engine(); + engine.setToClassPathSourceFactory(); + engine.addSharedMethod(new StrKit()); + } + + /** + * 使用自定义模板生成 MappingKit + */ + public void setTemplate(String template) { + this.template = template; + } + + public void setMappingKitOutputDir(String mappingKitOutputDir) { + if (StrKit.notBlank(mappingKitOutputDir)) { + this.mappingKitOutputDir = mappingKitOutputDir; + } + } + + public String getMappingKitOutputDir() { + return mappingKitOutputDir; + } + + public void setMappingKitPackageName(String mappingKitPackageName) { + if (StrKit.notBlank(mappingKitPackageName)) { + this.mappingKitPackageName = mappingKitPackageName; + } + } + + public String getMappingKitPackageName() { + return mappingKitPackageName; + } + + public void setMappingKitClassName(String mappingKitClassName) { + if (StrKit.notBlank(mappingKitClassName)) { + this.mappingKitClassName = StrKit.firstCharToUpperCase(mappingKitClassName); + } + } + + public String getMappingKitClassName() { + return mappingKitClassName; + } + + public void generate(List tableMetas) { + System.out.println("Generate MappingKit file ..."); + System.out.println("MappingKit Output Dir: " + mappingKitOutputDir); + + Kv data = Kv.by("mappingKitPackageName", mappingKitPackageName); + data.set("mappingKitClassName", mappingKitClassName); + data.set("tableMetas", tableMetas); + data.set("nowtime", new Date()); + + String ret = engine.getTemplate(template).renderToString(data); + writeToFile(ret); + } + + /** + * _MappingKit.java 覆盖写入 + */ + protected void writeToFile(String ret) { + File dir = new File(mappingKitOutputDir); + if (!dir.exists()) { + dir.mkdirs(); + } + + String target = mappingKitOutputDir + File.separator + mappingKitClassName + ".java"; + OutputStreamWriter osw = null; + try { + osw = new OutputStreamWriter(new FileOutputStream(target), "UTF-8"); + osw.write(ret); + } + catch (IOException e) { + throw new RuntimeException(e); + } + finally { + if (osw != null) { + try {osw.close();} catch (IOException e) { + LogKit.error(e.getMessage(), e);} + } + } + } +} + + + + diff --git a/ssjygl-xsx-common/src/main/java/generator/MetaBuilder.java b/ssjygl-xsx-common/src/main/java/generator/MetaBuilder.java new file mode 100644 index 0000000..b78b3c6 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/MetaBuilder.java @@ -0,0 +1,518 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package generator; + +import com.jfinal.kit.LogKit; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.dialect.Dialect; +import com.jfinal.plugin.activerecord.dialect.MysqlDialect; +import com.jfinal.plugin.activerecord.dialect.OracleDialect; +import com.jfinal.plugin.activerecord.generator.TypeMapping; + +import javax.sql.DataSource; +import java.sql.*; +import java.util.*; + +/** + * MetaBuilder + */ +public class MetaBuilder { + + protected DataSource dataSource; + protected Dialect dialect = new MysqlDialect(); + protected Set excludedTables = new TreeSet(String.CASE_INSENSITIVE_ORDER); + + protected Connection conn = null; + protected DatabaseMetaData dbMeta = null; + + protected String[] removedTableNamePrefixes = null; + + protected TypeMapping typeMapping = new TypeMapping(); + + protected String[] tableArray = new String[]{}; + protected Comparator comparator = null; + + public MetaBuilder(DataSource dataSource) { + if (dataSource == null) { + throw new IllegalArgumentException("dataSource can not be null."); + } + this.dataSource = dataSource; + } + + public void setDialect(Dialect dialect) { + if (dialect != null) { + this.dialect = dialect; + } + } + + public void addExcludedTable(String... excludedTables) { + if (excludedTables != null) { + for (String table : excludedTables) { + this.excludedTables.add(table); + } + } + } + + public void setTableArray(String[] tableArray) { + this.tableArray = tableArray; + } + + /** + * 设置需要被移除的表名前缀,仅用于生成 modelName 与 baseModelName + * 例如表名 "osc_account",移除前缀 "osc_" 后变为 "account" + */ + public void setRemovedTableNamePrefixes(String... removedTableNamePrefixes) { + this.removedTableNamePrefixes = removedTableNamePrefixes; + } + + public void setTypeMapping(TypeMapping typeMapping) { + if (typeMapping != null) { + this.typeMapping = typeMapping; + } + } + + public void setComparator(Comparator comparator) { + this.comparator = comparator; + } + + public List build() { + System.out.println("Build TableMeta ..."); + try { + conn = dataSource.getConnection(); + dbMeta = conn.getMetaData(); + + List ret = new ArrayList(); + buildTableNames(ret); + + if (comparator != null) { + ret.sort(comparator); + } + + + for (TableMeta tableMeta : ret) { + buildPrimaryKey(tableMeta); + } + buildColumnMetas(ret); + removeNoPrimaryKeyTable(ret); + return ret; + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + } + } + + // 移除没有主键的 table + protected void removeNoPrimaryKeyTable(List ret) { + for (java.util.Iterator it = ret.iterator(); it.hasNext(); ) { + TableMeta tm = it.next(); + if (StrKit.isBlank(tm.primaryKey)) { + it.remove(); + System.err.println("Skip table " + tm.name + " because there is no primary key"); + } + } + } + + /** + * 通过继承并覆盖此方法,跳过一些不希望处理的 table,定制更加灵活的 table 过滤规则 + * + * @return 返回 true 时将跳过当前 tableName 的处理 + */ + protected boolean isSkipTable(String tableName) { + for (int i = 0; i < this.tableArray.length; i++) { + if (tableName.equals(tableArray[i])) { + return false; + } + } + return true; + } + + /** + * 构造 modelName,mysql 的 tableName 建议使用小写字母,多单词表名使用下划线分隔,不建议使用驼峰命名 + * oracle 之下的 tableName 建议使用下划线分隔多单词名,无论 mysql还是 oralce,tableName 都不建议使用驼峰命名 + */ + protected String buildModelName(String tableName) { + // 移除表名前缀仅用于生成 modelName、baseModelName,而 tableMeta.name 表名自身不能受影响 + if (removedTableNamePrefixes != null) { + for (String prefix : removedTableNamePrefixes) { + if (tableName.startsWith(prefix)) { + tableName = tableName.replaceFirst(prefix, ""); + break; + } + } + } + + // 将 oralce 大写的 tableName 转成小写,再生成 modelName + if (dialect instanceof OracleDialect) { + tableName = tableName.toLowerCase(); + } + + return StrKit.firstCharToUpperCase(StrKit.toCamelCase(tableName)); + } + + /** + * 使用 modelName 构建 baseModelName + */ + protected String buildBaseModelName(String modelName) { + return "Base" + modelName; + } + + /** + * 不同数据库 dbMeta.getTables(...) 的 schemaPattern 参数意义不同 + * 1:oracle 数据库这个参数代表 dbMeta.getUserName() + * 2:postgresql 数据库中需要在 jdbcUrl中配置 schemaPatter,例如: + * jdbc:postgresql://localhost:15432/djpt?currentSchema=public,sys,app + * 最后的参数就是搜索schema的顺序,DruidPlugin 下测试成功 + * 3:开发者若在其它库中发现工作不正常,可通过继承 MetaBuilder并覆盖此方法来实现功能 + */ + protected ResultSet getTablesResultSet() throws SQLException { + String schemaPattern = dialect instanceof OracleDialect ? dbMeta.getUserName() : null; + return dbMeta.getTables(conn.getCatalog(), schemaPattern, null, new String[]{"TABLE", "VIEW"}); +// return dbMeta.getTables(conn.getCatalog(), schemaPattern, null, new String[]{"TABLE"}); // 不支持 view 生成 + } + + protected void buildTableNames(List ret) throws SQLException { + ResultSet rs = getTablesResultSet(); + while (rs.next()) { + String tableName = rs.getString("TABLE_NAME"); + + if (excludedTables.contains(tableName)) { + System.out.println("Skip table :" + tableName); + continue; + } + if (isSkipTable(tableName)) { + System.out.println("Skip table :" + tableName); + continue; + } + + TableMeta tableMeta = new TableMeta(); + tableMeta.name = tableName; + tableMeta.remarks = rs.getString("REMARKS"); + + tableMeta.modelName = buildModelName(tableName); + tableMeta.baseModelName = buildBaseModelName(tableMeta.modelName); + ret.add(tableMeta); + } + rs.close(); + } + + protected void buildPrimaryKey(TableMeta tableMeta) throws SQLException { + if ("VIEW".equals(tableMeta.remarks)) { + tableMeta.primaryKey = "VIEW HAS NO PRIMARY KEY"; + } else { + ResultSet rs = dbMeta.getPrimaryKeys(conn.getCatalog(), null, tableMeta.name); + + String primaryKey = ""; + int index = 0; + while (rs.next()) { + if (index++ > 0) { + primaryKey += ","; + } + primaryKey += rs.getString("COLUMN_NAME"); + } + + // 无主键的 table 将在后续的 removeNoPrimaryKeyTable() 中被移除,不再抛出异常 + // if (StrKit.isBlank(primaryKey)) { + // throw new RuntimeException("primaryKey of table \"" + tableMeta.name + "\" required by active record pattern"); + // } + + tableMeta.primaryKey = primaryKey; + rs.close(); + } + } + + /** + * TODO: buildColumnMetas 这段是将jfinal源码中两段代码整合到一起的,有点乱,还需要整理一下 + */ + /** + * 文档参考: + * http://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html + *

+ * JDBC 与时间有关类型转换规则,mysql 类型到 java 类型如下对应关系: + * DATE java.sql.Date + * DATETIME java.sql.Timestamp + * TIMESTAMP[(M)] java.sql.Timestamp + * TIME java.sql.Time + *

+ * 对数据库的 DATE、DATETIME、TIMESTAMP、TIME 四种类型注入 new java.util.Date()对象保存到库以后可以达到“秒精度” + * 为了便捷性,getter、setter 方法中对上述四种字段类型采用 java.util.Date,可通过定制 TypeMapping 改变此映射规则 + */ + protected void buildColumnMetas(List tableMetas) { + Connection conn = null; + try { + conn = dataSource.getConnection(); + DatabaseMetaData dbMeta = conn.getMetaData(); + for (TableMeta tableMeta : tableMetas) { + String sql = dialect.forTableBuilderDoBuild(tableMeta.name); + Statement stm = conn.createStatement(); + ResultSet sqlrs = stm.executeQuery(sql); + ResultSetMetaData rsmd = sqlrs.getMetaData(); + + // 重建整个 TableMeta.columnMetas + List columnMetas = tableMeta.columnMetas; + // 通过查看 dbMeta.getColumns(...) 源码注释,还可以获取到更多 meta data + ResultSet rs = dbMeta.getColumns(conn.getCatalog(), null, tableMeta.name, null); + while (rs.next()) { + String name = rs.getString("COLUMN_NAME"); // 名称 + ColumnMeta columnMeta = new ColumnMeta(); + int nowcolidx = 0; + + for (int i = 1; i <= rsmd.getColumnCount(); i++) { + if (rsmd.getColumnName(i).equals(name)) { + nowcolidx = i; + break; + } + } + + columnMeta.name = name; // 名称 + + columnMeta.type = rs.getString("TYPE_NAME"); // 类型 + if (columnMeta.type == null) { + columnMeta.type = ""; + } + + int columnSize = rs.getInt("COLUMN_SIZE"); // 长度 + columnMeta.columnSize = columnSize; + if (columnSize > 0) { + columnMeta.type = columnMeta.type + "(" + columnSize; + int decimalDigits = rs.getInt("DECIMAL_DIGITS"); // 小数位数 + if (decimalDigits > 0) { + columnMeta.type = columnMeta.type + "," + decimalDigits; + } + columnMeta.type = columnMeta.type + ")"; + columnMeta.decimalDigits = decimalDigits; + } + + + columnMeta.isNullable = rs.getString("IS_NULLABLE"); // 是否允许 NULL 值 + if (columnMeta.isNullable == null) { + columnMeta.isNullable = ""; + } + + columnMeta.isPrimaryKey = "NO"; + String[] keys = tableMeta.primaryKey.split(","); + for (String key : keys) { + if (key.equalsIgnoreCase(columnMeta.name)) { + columnMeta.isPrimaryKey = "YES"; + break; + } + } + + columnMeta.defaultValue = rs.getString("COLUMN_DEF"); // 默认值 + if (columnMeta.defaultValue == null) { + columnMeta.defaultValue = ""; + } + + columnMeta.remarks = rs.getString("REMARKS"); // 备注 + if (columnMeta.remarks == null) { + columnMeta.remarks = ""; + } + + if (tableMeta.colNameMaxLen < columnMeta.name.length()) { + tableMeta.colNameMaxLen = columnMeta.name.length(); + } + if (tableMeta.colTypeMaxLen < columnMeta.type.length()) { + tableMeta.colTypeMaxLen = columnMeta.type.length(); + } + if (tableMeta.colDefaultValueMaxLen < columnMeta.defaultValue.length()) { + tableMeta.colDefaultValueMaxLen = columnMeta.defaultValue.length(); + } + + String typeStr = null; + if (dialect.isKeepByteAndShort()) { + int type = rsmd.getColumnType(nowcolidx); + if (type == Types.TINYINT) { + typeStr = "java.lang.Byte"; + } else if (type == Types.SMALLINT) { + typeStr = "java.lang.Short"; + } + } + + if (typeStr == null) { + String colClassName = rsmd.getColumnClassName(nowcolidx); + typeStr = typeMapping.getType(colClassName); + } + + if (typeStr == null) { + int type = rsmd.getColumnType(nowcolidx); + if (type == Types.BINARY || type == Types.VARBINARY || type == Types.LONGVARBINARY || type == Types.BLOB) { + typeStr = "byte[]"; + } else if (type == Types.CLOB || type == Types.NCLOB) { + typeStr = "java.lang.String"; + } + // 支持 oracle 的 TIMESTAMP、DATE 字段类型,其中 Types.DATE 值并不会出现 + // 保留对 Types.DATE 的判断,一是为了逻辑上的正确性、完备性,二是其它类型的数据库可能用得着 + else if (type == Types.TIMESTAMP || type == Types.DATE) { + typeStr = "java.util.Date"; + } + // 支持 PostgreSql 的 jsonb json + else if (type == Types.OTHER) { + typeStr = "java.lang.Object"; + } else { + typeStr = "java.lang.String"; + } + } + + typeStr = handleJavaType(typeStr, rsmd, nowcolidx); + + // 构造验证字符串 start + // TODO: 这段感觉不应该出现在这里 + columnMeta.javaType = typeStr; + if (typeStr == null) { + columnMeta.shortJavaType = "String"; + } else { + String shortJavaType = typeStr.substring(typeStr.lastIndexOf(".") + 1, typeStr.length()); + columnMeta.shortJavaType = shortJavaType; + + if ("BigDecimal".equals(shortJavaType)) { + columnMeta.min = -Math.pow(10.0, columnSize + 1.0 - columnMeta.decimalDigits) + 1; + columnMeta.max = Math.pow(10.0, columnSize + 1.0 - columnMeta.decimalDigits) - 1; + columnMeta.descstr = "范围"; + } else if ("Double".equals(shortJavaType)) { + columnMeta.min = -Math.pow(10.0, columnSize + 1.0 - columnMeta.decimalDigits) + 1.0; + columnMeta.max = Math.pow(10.0, columnSize + 1.0 - columnMeta.decimalDigits) - 1.0; + columnMeta.descstr = "范围"; + } else if ("Long".equals(shortJavaType)) { + columnMeta.min = -Double.valueOf(Math.pow(10.0, columnSize + 1.0) - 1).longValue(); + columnMeta.max = Double.valueOf(Math.pow(10.0, columnSize + 1.0) - 1).longValue(); + columnMeta.descstr = "范围"; + } else if ("Integer".equals(shortJavaType)) { + columnMeta.min = -Double.valueOf(Math.pow(10.0, columnSize + 1.0) - 1).intValue(); + columnMeta.max = Double.valueOf(Math.pow(10.0, columnSize + 1.0) - 1).intValue(); + columnMeta.descstr = "范围"; + } else if ("Short".equals(shortJavaType)) { + columnMeta.min = -Double.valueOf(Math.pow(10.0, columnSize + 1.0) - 1).shortValue(); + columnMeta.max = Double.valueOf(Math.pow(10.0, columnSize + 1.0) - 1).shortValue(); + columnMeta.descstr = "范围"; + } else { + columnMeta.shortJavaType = "String"; + + if ("NO".equals(columnMeta.isNullable) && !"CURRENT_TIMESTAMP".equals(columnMeta.defaultValue)) { + columnMeta.min = 1; + } else { + columnMeta.min = 0; + } + +// mysql 4.0版本以下,varchar(50), 指的是50字节,如果存放utf8汉字时,只能存放16个(每个汉字3字节) +// mysql 5.0版本以上,varchar(50), 指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。 + + columnMeta.max = columnSize; + columnMeta.descstr = "长度"; + } + + // 如果是主键,默认将 min 设置为大于 0 + // 默认将 _id 结尾的定为 主键字段 + if ("YES".equals(columnMeta.isPrimaryKey) || columnMeta.name.endsWith("_id")) { + columnMeta.min = 1; + } + } + // 构造验证字符串 end + + // 构造字段对应的属性名 attrName + columnMeta.attrName = buildAttrName(columnMeta.name); + + tableMeta.columnMetas.add(columnMeta); + } + rs.close(); + + sqlrs.close(); + stm.close(); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + LogKit.error(e.getMessage(), e); + } + } + } + + + } + + /** + * handleJavaType(...) 方法是用于处理 java 类型的回调方法,当 jfinal 默认 + * 处理规则无法满足需求时,用户可以通过继承 MetaBuilder 并覆盖此方法定制自己的 + * 类型转换规则 + *

+ * 当前实现只处理了 Oracle 数据库的 NUMBER 类型,根据精度与小数位数转换成 Integer、 + * Long、BigDecimal。其它数据库直接返回原值 typeStr + *

+ * Oracle 数据库 number 类型对应 java 类型: + * 1:如果不指定number的长度,或指定长度 n > 18 + * number 对应 java.math.BigDecimal + * 2:如果number的长度在10 <= n <= 18 + * number(n) 对应 java.lang.Long + * 3:如果number的长度在1 <= n <= 9 + * number(n) 对应 java.lang.Integer 类型 + *

+ * 社区分享:《Oracle NUMBER 类型映射改进》http://www.jfinal.com/share/1145 + */ + protected String handleJavaType(String typeStr, ResultSetMetaData rsmd, int column) throws SQLException { + // 当前实现只处理 Oracle + if (!dialect.isOracle()) { + return typeStr; + } + + // 默认实现只处理 BigDecimal 类型 + if ("java.math.BigDecimal".equals(typeStr)) { + int scale = rsmd.getScale(column); // 小数点右边的位数,值为 0 表示整数 + int precision = rsmd.getPrecision(column); // 最大精度 + if (scale == 0) { + if (precision <= 9) { + typeStr = "java.lang.Integer"; + } else if (precision <= 18) { + typeStr = "java.lang.Long"; + } else { + typeStr = "java.math.BigDecimal"; + } + } else { + // 非整数都采用 BigDecimal 类型,需要转成 double 的可以覆盖并改写下面的代码 + typeStr = "java.math.BigDecimal"; + } + } + + return typeStr; + } + + /** + * 构造 colName 所对应的 attrName,mysql 数据库建议使用小写字段名或者驼峰字段名 + * Oralce 反射将得到大写字段名,所以不建议使用驼峰命名,建议使用下划线分隔单词命名法 + */ + protected String buildAttrName(String colName) { + if (dialect instanceof OracleDialect) { + colName = colName.toLowerCase(); + } + return StrKit.toCamelCase(colName); + } +} + + + + + + + diff --git a/ssjygl-xsx-common/src/main/java/generator/ModelGenerator.java b/ssjygl-xsx-common/src/main/java/generator/ModelGenerator.java new file mode 100644 index 0000000..b2057ec --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/ModelGenerator.java @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package generator; + +import com.jfinal.kit.Kv; +import com.jfinal.kit.StrKit; +import com.jfinal.template.Engine; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Date; +import java.util.List; + +/** + * Model 生成器 + */ +public class ModelGenerator { + + protected Engine engine; + protected String template = "/generator/model_template.jf"; + + protected String modelPackageName; + protected String baseModelPackageName; + protected String modelOutputDir; + protected boolean generateDaoInModel = false; + + public ModelGenerator(String modelPackageName, String baseModelPackageName, String modelOutputDir) { + if (StrKit.isBlank(modelPackageName)) { + throw new IllegalArgumentException("modelPackageName can not be blank."); + } + if (modelPackageName.contains("/") || modelPackageName.contains("\\")) { + throw new IllegalArgumentException("modelPackageName error : " + modelPackageName); + } + if (StrKit.isBlank(baseModelPackageName)) { + throw new IllegalArgumentException("baseModelPackageName can not be blank."); + } + if (baseModelPackageName.contains("/") || baseModelPackageName.contains("\\")) { + throw new IllegalArgumentException("baseModelPackageName error : " + baseModelPackageName); + } + if (StrKit.isBlank(modelOutputDir)) { + throw new IllegalArgumentException("modelOutputDir can not be blank."); + } + + this.modelPackageName = modelPackageName; + this.baseModelPackageName = baseModelPackageName; + this.modelOutputDir = modelOutputDir; + + initEngine(); + } + + protected void initEngine() { + engine = new Engine(); + engine.setToClassPathSourceFactory(); + engine.addSharedMethod(new StrKit()); + } + + /** + * 使用自定义模板生成 model + */ + public void setTemplate(String template) { + this.template = template; + } + + public void setGenerateDaoInModel(boolean generateDaoInModel) { + this.generateDaoInModel = generateDaoInModel; + } + + public void generate(List tableMetas) { + System.out.println("Generate model ..."); + System.out.println("Model Output Dir: " + modelOutputDir); + + for (TableMeta tableMeta : tableMetas) { + genModelContent(tableMeta); + } + writeToFile(tableMetas); + } + + protected void genModelContent(TableMeta tableMeta) { + Kv data = Kv.by("modelPackageName", modelPackageName); + data.set("baseModelPackageName", baseModelPackageName); + data.set("generateDaoInModel", generateDaoInModel); + data.set("tableMeta", tableMeta); + data.set("nowtime", new Date()); + + String ret = engine.getTemplate(template).renderToString(data); + tableMeta.modelContent = ret; + } + + protected void writeToFile(List tableMetas) { + try { + for (TableMeta tableMeta : tableMetas) { + writeToFile(tableMeta); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 若 model 文件存在,则不生成,以免覆盖用户手写的代码 + */ + protected void writeToFile(TableMeta tableMeta) throws IOException { + File dir = new File(modelOutputDir); + if (!dir.exists()) { + dir.mkdirs(); + } + + String target = modelOutputDir + File.separator + tableMeta.modelName + ".java"; + + File file = new File(target); + if (file.exists()) { + return ; // 若 Model 存在,不覆盖 + } + + OutputStreamWriter osw = null; + try { + osw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); + osw.write(tableMeta.modelContent); + } + finally { + if (osw != null) { + osw.close(); + } + } + } + + public String getModelPackageName() { + return modelPackageName; + } + + public String getBaseModelPackageName() { + return baseModelPackageName; + } + + public String getModelOutputDir() { + return modelOutputDir; + } +} + + diff --git a/ssjygl-xsx-common/src/main/java/generator/TableMeta.java b/ssjygl-xsx-common/src/main/java/generator/TableMeta.java new file mode 100644 index 0000000..85369a2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/java/generator/TableMeta.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2011-2019, James Zhan 詹波 (jfinal@126.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package generator; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * TableMeta + */ +@SuppressWarnings("serial") +public class TableMeta implements Serializable { + + public String name; // 表名 + public String remarks; // 表备注 + public String primaryKey; // 主键,复合主键以逗号分隔 + public List columnMetas = new ArrayList(); // 字段 meta + + // --------- + + public String baseModelName; // 生成的 base model 名 + public String baseModelContent; // 生成的 base model 内容 + + public String modelName; // 生成的 model 名 + public String modelContent; // 生成的 model 内容 + + // --------- + + public int colNameMaxLen = "Field".length(); // 字段名最大宽度,用于辅助生成字典文件样式 + public int colTypeMaxLen = "Type".length(); // 字段类型最大宽度,用于辅助生成字典文件样式 + public int colDefaultValueMaxLen = "Default".length(); // 字段默认值最大宽度,用于辅助生成字典文件样式 +} + + + + diff --git a/ssjygl-xsx-common/src/main/resources/db.properties b/ssjygl-xsx-common/src/main/resources/db.properties new file mode 100644 index 0000000..43cd8a5 --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/db.properties @@ -0,0 +1,4 @@ +# mysql +jdbcUrl=jdbc:mysql://rm-wz9wa070076b2uge2ro.mysql.rds.aliyuncs.com:3306/ssjy_xsx_dev?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true +user=ssjy_xsx +password=Ssjy_xs_890 \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/resources/generator/base_model_template.jf b/ssjygl-xsx-common/src/main/resources/generator/base_model_template.jf new file mode 100644 index 0000000..ec1e8be --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/generator/base_model_template.jf @@ -0,0 +1,97 @@ +package #(baseModelPackageName); + +import com.cowr.common.base.BaseModel; +import com.jfinal.plugin.activerecord.IBean; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * Generated by COWR #(nowtime) + * TableName: #(tableMeta.name) + * Remarks: #(tableMeta.remarks) + * PrimaryKey: #(tableMeta.primaryKey) + */ +#if (generateChainSetter) +@SuppressWarnings({"serial", "unchecked"}) +#else +@SuppressWarnings("serial") +#end +public abstract class #(tableMeta.baseModelName)> extends BaseModel implements IBean { + + public static final String tablename = "#(tableMeta.name)"; + + @JSONField(serialize=false) + public String getTablename(){ + return tablename; + } + +#set(b = generateChainSetter) +#for(cm : tableMeta.columnMetas) + #set(argName = javaKeyword.contains(cm.attrName) ? '_' + cm.attrName : cm.attrName) + /** + * name: #(cm.name) + * type: #(cm.type) + * isNullable: #(cm.isNullable) + * isPrimaryKey: #(cm.isPrimaryKey) + * defaultValue: #(cm.defaultValue) + * @param #(argName) #(cm.remarks) + */ + @JSONField(name="#(cm.name)") + public #(b ? 'M' : 'void') set#(firstCharToUpperCase(cm.attrName))(#(cm.javaType) #(argName)) { + set("#(cm.name)", #(argName)); + #if (b) + return (M)this; + #end + } + + #set(getterOfModel = getterTypeMap.get(cm.javaType)) + #if (isBlank(getterOfModel)) + #set(getterOfModel = 'get') + #end + + /** + * @return #(cm.name) #(cm.remarks) + */ + @JSONField(name="#(cm.name)") + public #(cm.javaType) get#(firstCharToUpperCase(cm.attrName))() { + return #(getterOfModel)("#(cm.name)"); + } + +#end + +#if( tableMeta.remarks == "VIEW" ) + public boolean checkExistsByPk() { + throw new RuntimeException("视图Model没有主键"); + } + public boolean findByPk() { + throw new RuntimeException("视图Model没有主键"); + } + public boolean get() { + throw new RuntimeException("视图Model没有主键"); + } + public boolean save() { + throw new RuntimeException("视图Model只允许调用查询方法"); + } + public boolean delete() { + throw new RuntimeException("视图Model只允许调用查询方法"); + } + public boolean del() { + throw new RuntimeException("视图Model只允许调用查询方法"); + } + public boolean deleteById(Object idValue) { + throw new RuntimeException("视图Model只允许调用查询方法"); + } + public boolean deleteById(Object... idValues) { + throw new RuntimeException("视图Model只允许调用查询方法"); + } + public boolean deleteById(com.jfinal.plugin.activerecord.Table table, Object... idValues) { + throw new RuntimeException("视图Model只允许调用查询方法"); + } + public boolean update() { + throw new RuntimeException("视图Model只允许调用查询方法"); + } + public boolean edit() { + throw new RuntimeException("视图Model只允许调用查询方法"); + } +#end +} + diff --git a/ssjygl-xsx-common/src/main/resources/generator/controller_template.jf b/ssjygl-xsx-common/src/main/resources/generator/controller_template.jf new file mode 100644 index 0000000..b047338 --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/generator/controller_template.jf @@ -0,0 +1,98 @@ +package #(packageName).#(tableMeta.modelName.toLowerCase()); + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import #(modelPackageName).#(tableMeta.modelName); +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR #(nowtime) + * TableName: #(tableMeta.name) + * Remarks: #(tableMeta.remarks) + * PrimaryKey: #(tableMeta.primaryKey) + */ +public class #(tableMeta.modelName)#(suffix) extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(#(tableMeta.modelName)PKValidator.class) + public void checkExistsByPk(){ + #(tableMeta.modelName) model = getModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + renderJson(#(tableMeta.modelName)Service.me.checkExistsByPk(model)); + } + + /** + * 新增 #(tableMeta.name) #(tableMeta.remarks) + */ + @Before(#(tableMeta.modelName)Validator.class) + public void save(){ + #(tableMeta.modelName) model = getModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + renderJson(#(tableMeta.modelName)Service.me.save(model)); + } + + /** + * 删除 #(tableMeta.name) #(tableMeta.remarks) + */ + @Before(#(tableMeta.modelName)PKValidator.class) + public void del(){ + #(tableMeta.modelName) model = getModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + renderJson(#(tableMeta.modelName)Service.me.delete(model)); + } + + /** + * 恢复 #(tableMeta.name) #(tableMeta.remarks) + */ + @Before(#(tableMeta.modelName)PKValidator.class) + public void restore(){ + #(tableMeta.modelName) model = getModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + renderJson(#(tableMeta.modelName)Service.me.restore(model)); + } + + /** + * 修改 #(tableMeta.name) #(tableMeta.remarks) + */ + @Before(#(tableMeta.modelName)Validator.class) + public void edit(){ + #(tableMeta.modelName) model = getModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + renderJson(#(tableMeta.modelName)Service.me.update(model)); + } + + /** + * 分页查找 #(tableMeta.name) #(tableMeta.remarks) + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(#(tableMeta.modelName)Service.me.find(pp))); + } + + /** + * 按主键查找单个对象 #(tableMeta.name) #(tableMeta.remarks) + */ + @Before(#(tableMeta.modelName)PKValidator.class) + public void findByPk(){ + #(tableMeta.modelName) model = getModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + renderJson(#(tableMeta.modelName)Service.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 #(tableMeta.name) #(tableMeta.remarks) + */ + @Before(#(tableMeta.modelName)PKValidator.class) + public void get(){ + #(tableMeta.modelName) model = getModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + renderJson(#(tableMeta.modelName)Service.me.findByPk(model)); + } + + /** + * 返回所有 #(tableMeta.name) #(tableMeta.remarks) + */ + public void list(){ + renderJson(Result.object(#(tableMeta.modelName)Service.me.list())); + } +} + diff --git a/ssjygl-xsx-common/src/main/resources/generator/mapping_kit_template.jf b/ssjygl-xsx-common/src/main/resources/generator/mapping_kit_template.jf new file mode 100644 index 0000000..cc8a6c0 --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/generator/mapping_kit_template.jf @@ -0,0 +1,32 @@ +package #(mappingKitPackageName); + +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; + +/** + * Generated by COWR #(nowtime) + *

+ * Example:
+ * public void configPlugin(Plugins me) {
+ *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
+ *     #(mappingKitClassName).mapping(arp);
+ *     me.add(arp);
+ * }
+ * 
+ */ +public class #(mappingKitClassName) { + + public static void mapping(ActiveRecordPlugin arp) { + #for (tableMeta : tableMetas) + #if (tableMeta.primaryKey.contains(",")) + // Composite Primary Key order: #(tableMeta.primaryKey) + #end + #if(tableMeta.primaryKey == "VIEW HAS NO PRIMARY KEY") + arp.addMapping("#(tableMeta.name)", #(tableMeta.modelName).class); + #else + arp.addMapping("#(tableMeta.name)", "#(tableMeta.primaryKey)", #(tableMeta.modelName).class); + #end + #end + } +} + + diff --git a/ssjygl-xsx-common/src/main/resources/generator/model_template.jf b/ssjygl-xsx-common/src/main/resources/generator/model_template.jf new file mode 100644 index 0000000..4d0cef2 --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/generator/model_template.jf @@ -0,0 +1,19 @@ +package #(modelPackageName); + +import #(baseModelPackageName).#(tableMeta.baseModelName); + +/** + * Generated by COWR #(nowtime) + * TableName: #(tableMeta.name) + * Remarks: #(tableMeta.remarks) + * PrimaryKey: #(tableMeta.primaryKey) + */ +@SuppressWarnings("serial") +public class #(tableMeta.modelName) extends #(tableMeta.baseModelName)<#(tableMeta.modelName)> { + #if (generateDaoInModel) + public static final #(tableMeta.modelName) dao = new #(tableMeta.modelName)().dao(); + #else + + #end +} + diff --git a/ssjygl-xsx-common/src/main/resources/generator/pkvalidator_template.jf b/ssjygl-xsx-common/src/main/resources/generator/pkvalidator_template.jf new file mode 100644 index 0000000..5456ffc --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/generator/pkvalidator_template.jf @@ -0,0 +1,33 @@ +package #(packageName).#(tableMeta.modelName.toLowerCase()); + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import #(modelPackageName).#(tableMeta.modelName); +import com.jfinal.core.Controller; + +/** + * Generated by COWR #(nowtime) + * TableName: #(tableMeta.name) + * Remarks: #(tableMeta.remarks) + * PrimaryKey: #(tableMeta.primaryKey) + */ +public class #(tableMeta.modelName)#(suffix) extends CrudParamValidator { + @Override + protected void validate(Controller c) { +#for(cm : tableMeta.columnMetas) + #if(cm.isPrimaryKey == "YES") + validateRequired("#(cm.name)", "#(cm.name)", "#(cm.name) 必填"); + #if (cm.shortJavaType == "BigDecimal") + validateBigDecimal("#(cm.name)", new java.math.BigDecimal(#(cm.min)), new java.math.BigDecimal(#(cm.max)), "#(cm.name)", "#(cm.name) #(cm.descstr) #(cm.min)~#(cm.max)"); + #else + validate#(cm.shortJavaType)("#(cm.name)", 1, #(cm.max), "#(cm.name)", "#(cm.name) #(cm.descstr) #(cm.min)~#(cm.max)"); + #end + #end +#end + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-common/src/main/resources/generator/service_template.jf b/ssjygl-xsx-common/src/main/resources/generator/service_template.jf new file mode 100644 index 0000000..7c924d9 --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/generator/service_template.jf @@ -0,0 +1,49 @@ +package #(packageName).#(tableMeta.modelName.toLowerCase()); + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import #(modelPackageName).#(tableMeta.modelName); +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR #(nowtime) + * TableName: #(tableMeta.name) + * Remarks: #(tableMeta.remarks) + * PrimaryKey: #(tableMeta.primaryKey) + */ +public class #(tableMeta.modelName)#(suffix) extends BaseService { + public static final #(tableMeta.modelName)Service me = new #(tableMeta.modelName)Service(); + + public Page find(PageParam pp) { + String selectsql = "select * "; + String fromsql = "from #(tableMeta.name) t where 1=1 "; + List paraList = new ArrayList<>(); + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && #(tableMeta.modelName).dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List<#(tableMeta.modelName)> list() { + return #(tableMeta.modelName).dao.find("select * from #(tableMeta.name)"); + } +} + diff --git a/ssjygl-xsx-common/src/main/resources/generator/validator_template.jf b/ssjygl-xsx-common/src/main/resources/generator/validator_template.jf new file mode 100644 index 0000000..55b0df6 --- /dev/null +++ b/ssjygl-xsx-common/src/main/resources/generator/validator_template.jf @@ -0,0 +1,57 @@ +package #(packageName).#(tableMeta.modelName.toLowerCase()); + +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import #(modelPackageName).#(tableMeta.modelName); + +/** + * Generated by COWR #(nowtime) + * TableName: #(tableMeta.name) + * Remarks: #(tableMeta.remarks) + * PrimaryKey: #(tableMeta.primaryKey) + */ +public class #(tableMeta.modelName)#(suffix) extends CrudParamValidator { + @Override + protected void validate(Controller c) { +#for(cm : tableMeta.columnMetas) + #if(cm.isPrimaryKey == "YES") + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("#(cm.name)", "#(cm.name)", "#(cm.name) 必填"); + + #if (cm.shortJavaType == "BigDecimal") + validateBigDecimal("#(cm.name)", new java.math.BigDecimal(#(cm.min)), new java.math.BigDecimal(#(cm.max)), "#(cm.name)", "#(cm.name) #(cm.descstr) #(cm.min)~#(cm.max)"); + #else + validate#(cm.shortJavaType)("#(cm.name)", 1, #(cm.max), "#(cm.name)", "#(cm.name) #(cm.descstr) #(cm.min)~#(cm.max)"); + #end + } + #else + #if (cm.shortJavaType == "BigDecimal") + #if (cm.shortJavaType != "String" && cm.isNullable == "YES")if (StrKit.notBlank(c.get("#(cm.name)"))) { // 可为空字段,当传入值时,才做验证 #end + validate#(cm.shortJavaType)("#(cm.name)", new java.math.BigDecimal(#(cm.min)), new java.math.BigDecimal(#(cm.max)), "#(cm.name)", "#(cm.name) #(cm.descstr) #(cm.min)~#(cm.max)"); + #if (cm.shortJavaType != "String" && cm.isNullable == "YES")} #end + #else + #if (cm.shortJavaType != "String" && cm.isNullable == "YES")if (StrKit.notBlank(c.get("#(cm.name)"))) { // 可为空字段,当传入值时,才做验证 #end + validate#(cm.shortJavaType)("#(cm.name)", #(cm.min), #(cm.max), "#(cm.name)", "#(cm.name) #(cm.descstr) #(cm.min)~#(cm.max)"); + #if (cm.shortJavaType != "String" && cm.isNullable == "YES")} #end + #end + #end + #if(cm.javaType == "java.util.Date" && cm.defaultValue != "CURRENT_TIMESTAMP") + validateDate("#(cm.name)", "yyyy-MM-dd HH:mm:ss", false, "#(cm.name)", "#(cm.name) 格式 yyyy-MM-dd HH:mm:ss"); // 默认时间时间字符串格式,生成后根据情况调整 + #end +#end + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(#(tableMeta.modelName).class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/build.sh b/ssjygl-xsx-local/build.sh new file mode 100644 index 0000000..c60568a --- /dev/null +++ b/ssjygl-xsx-local/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +git pull +mvn clean package +./target/ssjygl-local-release/ssjygl-local/start.sh + + + diff --git a/ssjygl-xsx-local/debug.sh b/ssjygl-xsx-local/debug.sh new file mode 100644 index 0000000..63546a5 --- /dev/null +++ b/ssjygl-xsx-local/debug.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +./target/ssjygl-local-release/ssjygl-local/start.sh + + + diff --git a/ssjygl-xsx-local/package.xml b/ssjygl-xsx-local/package.xml new file mode 100644 index 0000000..2bec1d3 --- /dev/null +++ b/ssjygl-xsx-local/package.xml @@ -0,0 +1,69 @@ + + + + + release + + + + dir + + + + + + true + + + + + ${basedir}/src/main/resources + config + + + + + ${basedir}/src/main/webapp + webapp + + + + + ${basedir}/lib + lib + + + + + ${basedir} + + + 755 + + *.sh + *.bat + + + + + + + + lib + + + + + + + diff --git a/ssjygl-xsx-local/pom.xml b/ssjygl-xsx-local/pom.xml new file mode 100644 index 0000000..e8d2e64 --- /dev/null +++ b/ssjygl-xsx-local/pom.xml @@ -0,0 +1,219 @@ + + + + + 4.0.0 + com.cowr.ssjygl-xsx-local + ssjygl-xsx-local + 1.0 + jar + + 砂石经营管理-浠水县-本地服务 + http://www.example.com + + + UTF-8 + 1.8 + 1.8 + + + + + + ali-maven + http://maven.aliyun.com/nexus/content/groups/public + + true + + + true + always + fail + + + + + + + com.cowr.ssjygl-xsx-common + ssjygl-xsx-common + 1.0 + compile + + + + com.jfinal + jfinal + 4.9 + + + + com.jfinal + cos + 2020.4 + + + + com.jfinal + jfinal-undertow + 2.1 + + + + mysql + mysql-connector-java + 8.0.16 + + + + com.alibaba + druid + 1.1.22 + + + + com.alibaba + fastjson + 1.2.71 + + + + eu.bitwalker + UserAgentUtils + 1.21 + + + + log4j + log4j + 1.2.16 + + + + com.corundumstudio.socketio + netty-socketio + 1.7.18 + + + + org.quartz-scheduler + quartz + 2.3.2 + + + + de.ruedigermoeller + fst + 2.56 + + + + redis.clients + jedis + 2.9.0 + + + + org.apache.poi + poi-ooxml + 4.1.0 + + + + org.apache.poi + poi-ooxml-schemas + 4.1.0 + + + + org.apache.poi + ooxml-schemas + 1.4 + + + + net.coobird + thumbnailator + 0.4.8 + + + + org.apache.commons + commons-pool2 + 2.4.2 + + + + + org.slf4j + slf4j-nop + 1.7.25 + + compile + + + + + + + ssjygl-xsx-local + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + UTF-8 + + -parameters + + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + make-assembly + package + + single + + + + + ${project.artifactId} + + false + + true + + + package.xml + + + ${project.build.directory}/ + + + + + + + + diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogController.java new file mode 100644 index 0000000..ca85c37 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogController.java @@ -0,0 +1,22 @@ +package com.cowr.local.ssjygl.actioncmdlog; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:38 CST 2020 + * TableName: action_cmd_log + * Remarks: 日志相关- 硬件操作指令日志 + * PrimaryKey: id + */ +public class ActionCmdLogController extends Controller { + + /** + * 分页查找 action_cmd_log 日志相关- 硬件操作指令日志 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(ActionCmdLogService.me.find(pp))); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogPKValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogPKValidator.java new file mode 100644 index 0000000..de32795 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogPKValidator.java @@ -0,0 +1,24 @@ +package com.cowr.local.ssjygl.actioncmdlog; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: action_cmd_log + * Remarks: 日志相关- 硬件操作指令日志 + * PrimaryKey: id + */ +public class ActionCmdLogPKValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateLong("id", 1, 9223372036854775807L, "id", "id 范围 1~9223372036854775807"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogService.java new file mode 100644 index 0000000..3126048 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/actioncmdlog/ActionCmdLogService.java @@ -0,0 +1,61 @@ +package com.cowr.local.ssjygl.actioncmdlog; + +import com.cowr.common.Const; +import com.cowr.common.view.PageParam; +import com.cowr.model.ActionCmdLog; +import com.cowr.model.Sysuser; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: action_cmd_log + * Remarks: 日志相关- 硬件操作指令日志 + * PrimaryKey: id + */ +public class ActionCmdLogService { + public static final ActionCmdLogService me = new ActionCmdLogService(); + + public Page find(PageParam pp) { + String selectsql = "select * "; + String fromsql = "from action_cmd_log t where 1=1 "; + List paraList = new ArrayList<>(); + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && ActionCmdLog.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + /** + * TODO: 后续优化存储内容,要方便后续查询、统计等 + * @param content + * @param sysuser + * @return + */ + public boolean save(String content, Sysuser sysuser){ + ActionCmdLog cmd = new ActionCmdLog(); + cmd.setCreateUserId(sysuser.getId()); + cmd.setCreateUserName(sysuser.getName()); + cmd.setCreateTime(new Date()); + cmd.setContent(content); + + return cmd.save(); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseController.java new file mode 100644 index 0000000..2d63306 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseController.java @@ -0,0 +1,77 @@ +package com.cowr.local.ssjygl.authlicense; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.AuthLicense; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.authlicense.AuthLicensePKValidator; +import com.cowr.ssjygl.authlicense.AuthLicenseService; +import com.cowr.ssjygl.authlicense.AuthLicenseValidator; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Sun Jun 21 00:41:08 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +public class AuthLicenseController extends BaseController { + + /** + * 新增 auth_license 出入控制 - 授权车辆 + */ + @Before(AuthLicenseValidator.class) + public void save() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + AuthLicense model = getModel(AuthLicense.class, "", true); // 忽略不在model中的字段 + renderJson(AuthLicenseSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 auth_license 出入控制 - 授权车辆 + */ + @Before(AuthLicensePKValidator.class) + public void del() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + AuthLicense model = getModel(AuthLicense.class, "", true); // 忽略不在model中的字段 + renderJson(AuthLicenseSyncService.me.delete(model, tokenuser)); + } + + /** + * 分页查找 auth_license 出入控制 - 授权车辆 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String truck_license = getUpperCaseVal("truck_license"); + String stm = get("stm"); + String etm = get("etm"); + renderJson(Result.object(AuthLicenseService.me.find(pp, truck_license, stm, etm))); + } + + public void batchDel(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String trucks = get("trucks"); + + renderJson(AuthLicenseSyncService.me.batchDel(trucks, tokenuser)); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseSyncService.java new file mode 100644 index 0000000..c94465d --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/authlicense/AuthLicenseSyncService.java @@ -0,0 +1,205 @@ +package com.cowr.local.ssjygl.authlicense; + +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.model.AuthLicense; +import com.cowr.model.Blacklist; +import com.cowr.model.SyncTask; +import com.cowr.model.Sysuser; +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 com.jfinal.plugin.activerecord.Record; + +import java.sql.SQLException; +import java.util.*; + +/** + * Generated by COWR Fri May 01 23:24:53 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +public class AuthLicenseSyncService extends BaseService { + public static AuthLicenseSyncService me = new AuthLicenseSyncService(); + private static Log log = Log.getLog(AuthLicenseSyncService.class); + + public void init() { + clear(); +// update(); + } + + /** + * 将物流公司有效车辆,且不在 auth_license 里面的车辆加进去,将外销、采购车辆中的车牌不在 auth_license 中的车牌加进去 + *

+ * 1.系统启动时执行一次 + * 2.系统运行时,定时任务每天凌晨执行一次 + */ + public void update() { + Map map = new HashMap<>(); + SyncTask synctask = new SyncTask(); + + // 检查物流公司车辆 + List vls = AuthLicense.dao.find("select t.license truck_license from truck t \n" + + " left join auth_license v on t.license = v.truck_license \n" + + " where t.state = 1 \n" + // 不是黑名单中的车辆 + " and v.truck_license is null "); + + if (vls != null && !vls.isEmpty()) { + for (AuthLicense al : vls) { + map.put(al.getTruckLicense(), al); + } + } + +// // 检查已完成的临时订单 +// vls = AuthLicense.dao.find("select t.truck_license from transport t \n" + +// " left join auth_license v on t.truck_license = v.truck_license \n" + +// " where t.state = ? \n" + +// " and v.truck_license is null ", OrderStateEnum.RECEIVED.getStateid()); +// +// if (vls != null && !vls.isEmpty()) { +// for(AuthLicense al : vls){ +// map.put(al.getTruckLicense(), al); +// } +// } + + if (!map.isEmpty()) { + for (Map.Entry entry : map.entrySet()) { + synctask.addSaveData(entry.getValue()); + } + + Db.tx(new IAtom() { + @Override + public boolean run() { + try { + List inserts = new ArrayList<>(); + inserts.addAll(map.values()); + + Db.batchSave(inserts, inserts.size()); + + log.debug("auth_license 插入[" + map.size() + "]条"); + + SyncTaskService.me.save(synctask); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + } + } + + /** + * 从 auth_license 里面清除掉标记未黑名单的车辆,避免其他地方操作失败导致标记为黑名单的车辆还在 auth_license 里面 + * 1.系统启动时执行一次 + * 2.系统运行时,定时任务每天凌晨执行一次 + */ + public void clear() { + Double cnt = Db.queryDouble("select count(*) cnt from blacklist t where t.remove_user_id is null"); + + if (cnt == null) { + log.debug("没有有效的黑名单记录"); + return; + } + + Db.tx(new IAtom() { + @Override + public boolean run() { + try { + SyncTask synctask = new SyncTask(); + int size = 500; + int page = Math.round(cnt.floatValue() / size); + for (int p = 0; p < page; p++) { + int start = size * p; + int end = p + 1; + + List blacklist = Blacklist.dao.find( + "select * from blacklist t where t.remove_user_id is null limit " + start + ", " + end); + String sql = "select * from auth_license t where t.license in("; + + List paraList = new ArrayList<>(); + List paraSql = new ArrayList<>(); + for (Blacklist bl : blacklist) { + paraList.add(bl.getTruckLicense()); + paraSql.add("?"); + } + + List list = AuthLicense.dao.find(sql + StrUtil.join(paraSql, ",") + ")", paraList.toArray()); + + if (list != null && !list.isEmpty()) { + log.debug("发现[" + list.size() + "]个在黑名单中的车辆需要清理"); + String delsql = "delete from auth_license where truck_license in("; + List paraDelList = new ArrayList<>(); + List paraDelSql = new ArrayList<>(); + + for (AuthLicense bl : list) { + paraDelList.add(bl.getTruckLicense()); + paraDelSql.add("?"); + + synctask.addDeleteData(bl); + } + + int ret = Db.delete(delsql + StrUtil.join(paraDelSql, ",") + ")", paraDelList.toArray()); + log.debug("清理[" + ret + "]条车辆记录"); + + SyncTaskService.me.save(synctask); + } + } + + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + } + + public Result batchDel(String trucks, Sysuser sysuser) { + if (StrKit.isBlank(trucks)) { + return Result.failed("必须传入有效的车牌"); + } + + String[] arr = trucks.split(","); + + if (arr.length == 0) { + return Result.failed("必须传入有效的车牌"); + } + + Object[][] parms = new Object[arr.length][1]; + SyncTask synctask = new SyncTask(); + + for (int i = 0; i < arr.length; i++) { + String license = arr[i]; + parms[i] = new Object[]{license}; + + AuthLicense al = new AuthLicense(); + al.setTruckLicense(license); + + synctask.addDeleteData(al); + } + + Record logrecord = new Record(); + logrecord.set("trucks", trucks); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + int[] ret = Db.batch("delete from auth_license where truck_license = ?", parms, arr.length); + return ret.length == arr.length + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(AuthLicense.tablename, "truck_license", logrecord.toJson(), Enums.DataOpType.DELETE.getId(), sysuser); + } + }); + + return ret ? Result.success() : Result.failed("批量删除失败"); + } + +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/base/BaseSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/base/BaseSyncService.java new file mode 100644 index 0000000..d3e8940 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/base/BaseSyncService.java @@ -0,0 +1,148 @@ +package com.cowr.local.ssjygl.base; + +import com.cowr.common.base.BaseModel; +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.Enums; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.model.SyncTask; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; + +import java.util.Arrays; + +public class BaseSyncService extends BaseService { + private static Log log = Log.getLog(BaseSyncService.class); + + public Result save(BaseModel model, Sysuser sysuser, String... columns) { + if (model.checkDuplicate(columns)) { + return Result.failed(false, StrUtil.join(Arrays.asList(columns), ",") + " 数据重复"); + } else { + return save(model, sysuser); + } + } + + /** + * 新增 + * + * @param model BaseModel + * @return Result + */ + public Result save(BaseModel model, Sysuser sysuser) { + try { + // 注意这里,按主键未找到才做 save 操作 + if (model.checkExistsByPk()) { + return Result.failed(false, "主键冲突"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return model.save() + && SyncTaskService.me.save(new SyncTask().addSaveData(model)) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 删除 + * + * @param model BaseModel + * @return Result + */ + public Result delete(BaseModel model, Sysuser sysuser) { + try { + // 如果存在逻辑删除字段 del,则只做逻辑删除,不做物理删除 + if (model.hasDelKey()) { + return logicDel(model, sysuser); + } + + // 注意这里有 !,找到后才做 delete 操作 + if (!model.checkExistsByPk()) { + return Result.failed(false, "按主键未找到对应记录"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return model.delete() + && SyncTaskService.me.save(new SyncTask().addDeleteData(model)) + && ModifyLogService.me.save(model, (BaseModel) model.findByPk(), Enums.DataOpType.DELETE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return Result.object(ret); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + /** + * 修改 + * + * @param model BaseModel + * @return Result + */ + public Result update(BaseModel model, Sysuser sysuser) { + try { + // 注意这里有 !,找到后才做 update 操作 + BaseModel oldobj = (BaseModel) model.findByPk(); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return model.update() + && SyncTaskService.me.save(new SyncTask().addUpdateData(model)) + && ModifyLogService.me.save(model, oldobj, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + // 将修改后的对象返回 + String[] keys = model._getAttrNames(); + for (String key : keys) { + oldobj.set(key, model.get(key)); + } + + return ret ? Result.object(oldobj) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "修改失败"); + } + } + +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistController.java new file mode 100644 index 0000000..01ddb1f --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistController.java @@ -0,0 +1,97 @@ +package com.cowr.local.ssjygl.blacklist; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Blacklist; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.blacklist.BlacklistPKValidator; +import com.cowr.ssjygl.blacklist.BlacklistService; +import com.cowr.ssjygl.blacklist.BlacklistValidator; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: blacklist + * Remarks: 基础配置 - 车辆黑名单 + * PrimaryKey: id + */ +public class BlacklistController extends BaseController { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(BlacklistPKValidator.class) + public void checkExistsByPk(){ + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistService.me.checkExistsByPk(model)); + } + + /** + * 新增 blacklist 基础配置 - 车辆黑名单 + */ + @Before(BlacklistValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistSyncService.me.save(model, tokenuser)); + } + + /** + * 分页查找 blacklist 基础配置 - 车辆黑名单 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String truck_license = getUpperCaseVal("truck_license"); + renderJson(Result.object(BlacklistService.me.find(pp, truck_license))); + } + + /** + * 按主键查找单个对象 blacklist 基础配置 - 车辆黑名单 + */ + @Before(BlacklistPKValidator.class) + public void findByPk(){ + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistSyncService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 blacklist 基础配置 - 车辆黑名单 + */ + @Before(BlacklistPKValidator.class) + public void get(){ + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistSyncService.me.findByPk(model)); + } + + /** + * 返回所有 blacklist 基础配置 - 车辆黑名单 + */ + public void list(){ + renderJson(Result.object(BlacklistService.me.list())); + } + + + @Before(BlacklistPKValidator.class) + public void remove(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String id = get("id"); + renderJson(BlacklistSyncService.me.remove(id, tokenuser)); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistSyncService.java new file mode 100644 index 0000000..4287bfb --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/blacklist/BlacklistSyncService.java @@ -0,0 +1,147 @@ +package com.cowr.local.ssjygl.blacklist; + +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.base.BaseSyncService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.model.*; +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 BlacklistSyncService extends BaseSyncService { + public static BlacklistSyncService me = new BlacklistSyncService(); + private static Log log = Log.getLog(BlacklistSyncService.class); + + public Result save(Blacklist model, Sysuser sysuser) { + try { + Blacklist oldmodel = Blacklist.dao.findFirst("select * from blacklist t \n" + + " where t.remove_user_id is null \n" + + " and t.truck_license = ? ", model.getTruckLicense()); + + if(oldmodel != null){ + return Result.failed("【" + model.getTruckLicense() + "】还在黑名单中,未移除"); + } + + model.setId(StrKit.getRandomUUID()); + model.setSetTime(new Date()); + model.setSetUserId(sysuser.getId()); + + SyncTask synctask = new SyncTask(); + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(model.getTruckLicense()); + synctask.addDeleteData(authlic); // 加入黑名单时,要删除有效车牌 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.save(); + + synctask.addSaveData(model); // save 的需要再存数据库操作后,加入 synctask + + if (ret) { + Truck truck = Truck.dao.findById(model.getTruckLicense()); + + if (truck != null) { + Truck oldtruck = truck.clone(); + truck.setState(2); // 若是物流公司车辆,标记为已入黑名单 + + synctask.addUpdateData(truck); + + ret = truck.update() + && ModifyLogService.me.save(truck, oldtruck, Enums.DataOpType.UPDATE.getId(), sysuser); + } + } + + return ret + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 从黑名单中移除 + * 标记为移除,记录不删除 + * @param id + * @param sysuser + * @return + */ + public Result remove(String id, Sysuser sysuser) { + Blacklist model = Blacklist.dao.findById(id); + if (model == null) { + return Result.failed("按 id 未找到记录"); + } + + try { + model.setRemoveTime(new Date()); + model.setRemoveUserId(sysuser.getId()); + + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(model); + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(model.getTruckLicense()); + synctask.addSaveData(authlic); // 移除黑名单时,要添加有效车牌 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.update(); + + if (ret) { + Truck truck = Truck.dao.findById(model.getTruckLicense()); + + if (truck != null) { + Truck oldtruck = truck.clone(); + truck.setState(1); // 若是物流公司车辆,标记为移出黑名单 + + synctask.addUpdateData(truck); + + ret = truck.update() + && ModifyLogService.me.save(truck, oldtruck, Enums.DataOpType.UPDATE.getId(), sysuser); + } + } + + return ret + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, null, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/cache/CacheController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/cache/CacheController.java new file mode 100644 index 0000000..9e3ed5c --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/cache/CacheController.java @@ -0,0 +1,36 @@ +package com.cowr.local.ssjygl.cache; + +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.main.AuthInterceptor; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.main.Config; +import com.cowr.model.Supermarket; +import com.cowr.ssjygl.transportcompany.TransportCompanyService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.aop.Clear; +import com.jfinal.core.Controller; + +@Clear(AuthInterceptor.class) +public class CacheController extends Controller { + /** + * 重新加载本地数据库缓存到内存 + */ + public void reload(){ + Supermarket s = Supermarket.dao.findById(Config.configprop.getInt("current.supermarket_id")); + + if(s == null) { + renderJson(Result.failed("没有获取到有效的超市信息,检查配置是否正确")); + return; + } + + CliCacheData.SUP = s; + TransportCompanyService.me.initTransCoPriceModulus(); // 初始化物流公司价格系数配置 + TransPriceService.me.initTransPriceConfigSale(); // 初始化销售订单运输价格配置 + TransPriceService.me.initTransPriceConfigTransfer(); // 初始出转运订单运输价格配置 + TransPriceService.me.initTransPriceConfigTrash(); // 初始出废料订单运输价格配置 + + Config.deviceThread.restart(); + + renderJson(Result.success("重新加载完成")); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/CustomerController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/CustomerController.java new file mode 100644 index 0000000..44f9066 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/CustomerController.java @@ -0,0 +1,66 @@ +package com.cowr.local.ssjygl.customer; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Customer; +import com.cowr.ssjygl.customer.CustomerPKValidator; +import com.cowr.ssjygl.customer.CustomerService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: customer + * Remarks: 客户 + * PrimaryKey: id + */ +public class CustomerController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(CustomerPKValidator.class) + public void checkExistsByPk() { + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 customer 客户 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + Integer type = getInt("type"); + renderJson(Result.object(CustomerService.me.find(pp, name, del, type))); + } + + /** + * 按主键查找单个对象 customer 客户 + */ + @Before(CustomerPKValidator.class) + public void findByPk() { + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 customer 客户 + */ + @Before(CustomerPKValidator.class) + public void get() { + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerService.me.findByPk(model)); + } + + /** + * 返回所有 customer 客户 + */ + public void list() { + renderJson(Result.object(CustomerService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/contact/CustomerContactController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/contact/CustomerContactController.java new file mode 100644 index 0000000..e6ce91e --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/contact/CustomerContactController.java @@ -0,0 +1,68 @@ +package com.cowr.local.ssjygl.customer.contact; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerContact; +import com.cowr.ssjygl.customer.contact.CustomerContactPKValidator; +import com.cowr.ssjygl.customer.contact.CustomerContactService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_contact + * Remarks: 客户相关 - 客户联系人 + * PrimaryKey: id + */ +public class CustomerContactController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(CustomerContactPKValidator.class) + public void checkExistsByPk(){ + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 customer_contact 客户相关 - 客户联系人 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer customer_id = getInt("customer_id"); + String name = get("name"); + Integer del = getInt("del"); + String phone = get("phone"); + renderJson(Result.object(CustomerContactService.me.find(pp, customer_id, name, phone, del))); + } + + /** + * 按主键查找单个对象 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactPKValidator.class) + public void findByPk(){ + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactPKValidator.class) + public void get(){ + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactService.me.findByPk(model)); + } + + /** + * 返回所有 customer_contact 客户相关 - 客户联系人 + */ + public void list(){ + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(CustomerContactService.me.list(customer_id))); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/receiver/CustomerReceiverController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/receiver/CustomerReceiverController.java new file mode 100644 index 0000000..4e836e3 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/customer/receiver/CustomerReceiverController.java @@ -0,0 +1,71 @@ +package com.cowr.local.ssjygl.customer.receiver; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerReceiver; +import com.cowr.ssjygl.customer.receiver.CustomerReceiverPKValidator; +import com.cowr.ssjygl.customer.receiver.CustomerReceiverService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_receiver + * Remarks: 客户相关 - 客户收获地址 + * PrimaryKey: id + */ +public class CustomerReceiverController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(CustomerReceiverPKValidator.class) + public void checkExistsByPk() { + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 customer_receiver 客户相关 - 客户收获地址 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + Integer customer_id = getInt("customer_id"); + String name = get("name"); + Integer supermarket_id = getInt("supermarket_id"); + String phone = get("phone"); + renderJson(Result.object(CustomerReceiverService.me.find(pp, customer_id, name, phone, supermarket_id))); + } + + /** + * 按主键查找单个对象 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverPKValidator.class) + public void findByPk() { + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverPKValidator.class) + public void get() { + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverService.me.findByPk(model)); + } + + /** + * 返回所有 customer_receiver 客户相关 - 客户收获地址 + */ + public void list() { + Integer customer_id = getInt("customer_id"); + String name = get("name"); + Integer supermarket_id = getInt("supermarket_id"); + String phone = get("phone"); + renderJson(Result.object(CustomerReceiverService.me.list(customer_id, name, phone, supermarket_id))); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/Const.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/Const.java new file mode 100644 index 0000000..30c4df1 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/Const.java @@ -0,0 +1,6 @@ +package com.cowr.local.ssjygl.devicectrl.common; + +public class Const { + public static final String LicenseImgTmpFolder = "imgfile"; + public static final String PringExcelTmpFolder = "xlsfile"; +} 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 new file mode 100644 index 0000000..5b6d8dd --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/common/DeviceThread.java @@ -0,0 +1,325 @@ +package com.cowr.local.ssjygl.devicectrl.common; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.cowr.common.enums.Enums; +import com.cowr.local.ssjygl.devicectrl.controllers.Controller; +import com.cowr.local.ssjygl.devicectrl.controllers.InController; +import com.cowr.local.ssjygl.devicectrl.controllers.OutController; +import com.cowr.local.ssjygl.devicectrl.device.*; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Record; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +public class DeviceThread extends Thread { + private static Log log = Log.getLog(DeviceThread.class); + public static final Map defaultAddressTable = new HashMap() { + { + put("ping", new Integer(0).byteValue()); + put("laserIn", new Integer(40).byteValue()); + put("laserOut", new Integer(41).byteValue()); + put("sensorIn1", new Integer(44).byteValue()); + put("sensorIn2", new Integer(40).byteValue()); + put("sensorIn1Reset", new Integer(46).byteValue()); + put("sensorIn2Reset", new Integer(42).byteValue()); + put("sensorOut1", new Integer(45).byteValue()); + put("sensorOut2", new Integer(41).byteValue()); + put("sensorOut1Reset", new Integer(47).byteValue()); + put("sensorOut2Reset", new Integer(43).byteValue()); + put("rodIn1Up", new Integer(24).byteValue()); + put("rodIn1Down", new Integer(25).byteValue()); + put("rodIn2Up", new Integer(26).byteValue()); + put("rodIn2Down", new Integer(27).byteValue()); + put("rodOut1Up", new Integer(28).byteValue()); + put("rodOut1Down", new Integer(29).byteValue()); + put("rodOut2Up", new Integer(30).byteValue()); + put("rodOut2Down", new Integer(31).byteValue()); + } + }; + + public static boolean running = true; + + private Map cameras = new HashMap(); + private Map printerMap = new HashMap<>(); + private Map scaleMap = new HashMap<>(); + private Map plcMap = new HashMap<>(); + private List controllers = new ArrayList<>(); + private List threads = new ArrayList<>(); + + /* + { + "printer1": { "ip": "127.0.0.1", "port": 5005 }, + "printer2": { "ip": "127.0.0.1", "port": 5005 }, + "flow": [ + { + "which": "R01", + "camera": { "ip": "192.168.1.201" }, + "scale": { "ip": "127.0.0.1", "port": 5005 }, + "led": { "ip": "127.0.0.1", "port": 5005 }, + "plc": { "ip": "127.0.0.1", "port": 5005 } + }, + { + "which": "C01", + "camera": { "ip": "192.168.1.201" }, + "scale": { "ip": "127.0.0.1", "port": 5005 }, + "led": { "ip": "127.0.0.1", "port": 5005 }, + "plc": { "ip": "127.0.0.1", "port": 5005 } + } + ] + } + */ + + /** + * stop 不能用 + */ + public void close() { + try { + controllers.parallelStream().forEach(Controller::stop); + threads.parallelStream().forEach(Thread::interrupt); + + controllers.clear(); + cameras.clear(); + printerMap.clear(); + scaleMap.clear(); + plcMap.clear(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + public void restart() { + log.debug("重启硬件服务"); + try { + close(); + + Thread.sleep(10000); + + start(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + public void init() { + JSONObject config = new JSONObject(); // 硬件连接配置 + + try { + Record record = Db.findFirst("select * from device_config where supermarket_id = ? ", CliCacheData.SUP.getId()); + + if (record == null) { + log.error("从数据库未读到有效的配置"); + return; + } + + config = JSONObject.parseObject(record.getStr("content")); + + JSONObject printer1conf = config.getJSONObject("printer1"); + JSONObject printer2conf = config.getJSONObject("printer2"); + JSONArray flow = config.getJSONArray("flow"); + + printerMap.put(Enums.PrinterIdEnum.printer1.name(), new Printer(printer1conf.getString("ip"), printer1conf.getIntValue("port"))); + printerMap.put(Enums.PrinterIdEnum.printer2.name(), new Printer(printer2conf.getString("ip"), printer2conf.getIntValue("port"))); + + for (int i = 0; i < flow.size(); i++) { + //TODO debug 只连一个摄像头测试 +// if (i != 0) { +// continue; +// } + + JSONObject device = flow.getJSONObject(i); + + String which = device.getString("which"); + JSONObject cameraconf = device.getJSONObject("camera"); + JSONObject scaleconf = device.getJSONObject("scale"); + JSONObject ledconf = device.getJSONObject("led"); + JSONObject plcconf = device.getJSONObject("plc"); + + // 一个 PLC 只能连一次 + String plckey = plcconf.getString("ip") + "_" + plcconf.getIntValue("port"); + + // 一个摄像头只能连一次 + Camera camera = new Camera(which + "_camera", cameraconf.getString("ip")); + HuangZhouScale scale = new HuangZhouScale(which + "_scale", scaleconf.getString("ip"), scaleconf.getIntValue("port")); + LED led = new LED(which + "_led", ledconf.getString("ip"), ledconf.getIntValue("port")); + + PLC plc = null; + for (Map.Entry entry : plcMap.entrySet()) { + if (plckey.equals(entry.getValue().getId())) { + plc = entry.getValue(); + } + } + + if (plc == null) { + plc = new PLC(plckey, plcconf.getString("ip"), plcconf.getIntValue("port"), defaultAddressTable); + } + + Controller controller = null; + + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { + controller = new InController(which, camera, scale, led, plc); + } else if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { + controller = new OutController(which, camera, scale, led, plc); + } else { + log.error("which 值设置错误 %s ", config); + return; + } + + camera.setController(controller); + + cameras.put(camera.getIp(), camera); + scaleMap.put(which, scale); + plcMap.put(which, plc); + + controllers.add(controller); + } + } catch (Exception e) { + log.error("配置文件错误:%s", config); + log.error(e.getMessage(), e); + } + } + + public void start() { + init(); + + controllers.parallelStream().forEach(controller -> { + Thread ctrl = new Thread(controller); + ctrl.start(); + + threads.add(ctrl); + }); + } + + public double scale(String scaleId) throws IOException { + if (!this.scaleMap.containsKey(scaleId)) { + throw new IllegalArgumentException(scaleId + " does not exist"); + } + + return this.scaleMap.get(scaleId).weigh(); + } + + public void print(String printerId, File file) throws IOException { + if (!this.printerMap.containsKey(printerId)) { + throw new IllegalArgumentException(printerId + " does not exist"); + } + + this.printerMap.get(printerId).print(file); + } + + public Camera getCameraByIp(String ip) { + return cameras.get(ip); + } + + /** + * 定时任务定时扫描检查 + */ + public void checkTimeout() { + long st = System.currentTimeMillis(); + for (Map.Entry entry : cameras.entrySet()) { + if (entry.getValue() != null && st - entry.getValue().getKeeptime() > entry.getValue().TIME_OUT) { + entry.getValue().setIsconnected(false); + } + } + } + + + // cmd + + /** + * 抬1闸 + * + * @param which + */ + public void cmdRodUp(int num, String which) throws IOException { + if (StrKit.isBlank(which)) { + return; + } + + String cmd = "rod"; + + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { + cmd += "In"; + } else if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { + cmd += "Out"; + } else { + return; + } + + if (1 == num || 2 == num) { + cmd += num; + } else { + return; + } + + cmd += "Up"; + + plcCmd(which, cmd); + } + + public void plcCmd(String which, String cmd) throws IOException { + if (!this.plcMap.containsKey(which)) { + throw new IllegalArgumentException("which " + which + " does not exist"); + } + + if (!this.plcMap.get(which).getAddressTable().containsKey(cmd)) { + throw new IllegalArgumentException("cmd " + cmd + " does not exist"); + } + + this.plcMap.get(which).write(cmd); + } + + public boolean cmdLicense(String license, String which, boolean delete) { + for (Controller controller : controllers) { + if (controller.getWhich().equals(which)) { + controller.onLicenseResult(license, null, true, delete); + + return true; + } + } + + return false; + } + + public boolean cmdResetFlow(String which) { + for (Controller controller : controllers) { + if (controller.getWhich().equals(which)) { + controller.setResetFlow(true); + controller.resetCurrentLicense(); + + return true; + } + } + + return false; + } + + public Controller getController(String which){ + for (Controller controller : controllers) { + if (controller.getWhich().equals(which)) { + return controller; + } + } + + return null; + } + + /** + * 获取流程当前车牌 + * @param which + * @return + */ + public String getCtrlCurrentLicense(String which){ + for (Controller controller : controllers) { + if (controller.getWhich().equals(which)) { + return controller.getCurrentLicense(); + } + } + + return null; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/Controller.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/Controller.java new file mode 100644 index 0000000..2c1b233 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/Controller.java @@ -0,0 +1,453 @@ +package com.cowr.local.ssjygl.devicectrl.controllers; + +import com.alibaba.fastjson.JSONObject; +import com.cowr.local.ssjygl.devicectrl.device.AbsScale; +import com.cowr.local.ssjygl.devicectrl.device.Camera; +import com.cowr.local.ssjygl.devicectrl.device.LED; +import com.cowr.local.ssjygl.devicectrl.device.PLC; +import com.cowr.local.ssjygl.devicectrl.utils.LicenseJPGPair; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.transport.TransportDeviceService; +import com.cowr.local.ssjygl.transport.TransportSyncService; +import com.cowr.model.PostLicenseResult; +import com.jfinal.log.Log; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +public abstract class Controller implements Runnable { + private static Log log = Log.getLog(Controller.class); + + static String LEDWeightFormat = "%s\\n %s \\n重: %s吨"; + static String LEDInfoFormat = "%s\\n %s \\n%s"; + private AtomicBoolean resetFlow = new AtomicBoolean(); + + private String which; // 入场、出场 WhichEnum,规则:R01、R02、C01、C02 以此类推, TODO: 前端、后端、设备控制 几个部分可以共用一个枚举,保障一致性 + private Camera camera; // 车牌识别 + private AbsScale scale; // 入场称重 + private LED led; // 称重结果显示 + private PLC plc; // 道闸控制 + + private String currentLicense; // 当前流程车牌 + private BlockingQueue licenseQueue = new LinkedBlockingQueue<>(); // 车识识别结果队列 + private ReentrantLock licenseResultLock = new ReentrantLock(); + private ReentrantLock postLicenseQueueLock = new ReentrantLock(true); + + private boolean running = true; + + public Controller(String which, Camera camera, AbsScale scale, LED led, PLC plc) { + this.which = which; + this.camera = camera; + this.scale = scale; + this.led = led; + this.plc = plc; + } + + public void onLicenseResult(String license, File file, boolean head, boolean delete) { + if (license == null || license.isEmpty()) { + return; + } + if (license.equals(currentLicense)) { + log.debug("【%s】 当前车辆重复识别", currentLicense); + return; + } + if (licenseQueue.size() > 0) { + return; + } + long st = System.currentTimeMillis(); + licenseResultLock.lock(); + try { + boolean match = licenseQueue.stream().anyMatch(pair -> pair.license.equals(license)); + if (!match) { + if (head && !delete) { + List l = new ArrayList<>(); + licenseQueue.drainTo(l); + licenseQueue.add(new LicenseJPGPair(license, file)); + licenseQueue.addAll(l); + } else { + licenseQueue.add(new LicenseJPGPair(license, file)); + } + } + if (delete) { + LicenseJPGPair p = null; + Iterator it = licenseQueue.iterator(); + while (it.hasNext()) { + LicenseJPGPair _p = it.next(); + if (license.equals(_p.license)) { + p = _p; + } + } + if (p != null) { + try { + licenseQueue.remove(p); + } catch (Exception ignore) { + } + } + } + + postLicenseQueue(this.which, licenseQueue); + }finally { + licenseResultLock.unlock(); + log.debug("licenseResultLock time: %s", System.currentTimeMillis() - st); + } + } + + public void onLicenseResult(String license, File file) { + onLicenseResult(license, file, false, false); + } + + public boolean getResetFlow() { + return resetFlow.get(); + } + + public void setResetFlow(boolean reset) { + resetFlow.set(reset); + } + + PostLicenseResult postLicense(int supermarket_id, String license, File file, String which) { + return TransportSyncService.me.postLicense(supermarket_id, license, file, which); + } + + public Boolean postWeight(int supermarket_id, String license, Double weight, String which) { + return TransportSyncService.me.postWeigh(supermarket_id, license, weight, which); + } + + void postLicenseQueue(String which, BlockingQueue licenseQueue) { + postLicenseQueueLock.lock(); + long st = System.currentTimeMillis(); + try { + log.debug("postQueue=%s", licenseQueue.stream().map(pair -> pair.license).collect(Collectors.joining())); + + List strings = licenseQueue.stream().map(licenseJPGPair -> licenseJPGPair.license).collect(Collectors.toList()); + + TransportDeviceService.me.postLicenseQueue(strings, which); + }finally { + postLicenseQueueLock.unlock(); + log.debug("postLicenseQueueLock time: %s", System.currentTimeMillis() - st); + } + } + + public void stop() { + log.debug("停止 %s 流程", getWhich()); + + try { + camera.disconnect(); + camera = null; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + try { + scale.disconnect(); + scale = null; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + try { + led.disconnect(); + led = null; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + try { + plc.disconnect(); + plc = null; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + setResetFlow(false); + running = false; + + log.debug("流程 %s 停止完毕", getWhich()); + } + + // TODO 2020-05-08 目前设备状态没有实际用处 + public JSONObject getStatus() { + return null; + } + + public String getCurrentLicense() { + return currentLicense; + } + + public void setCurrentLicense(String license) { + currentLicense = license; + } + + public void resetCurrentLicense() { + currentLicense = null; + } + + public String getWhich() { + return which; + } + + public void setWhich(String which) { + this.which = which; + } + + public Camera getCamera() { + return camera; + } + + public void setCamera(Camera camera) { + this.camera = camera; + } + + public AbsScale getScale() { + return scale; + } + + public void setScale(AbsScale scale) { + this.scale = scale; + } + + public LED getLed() { + return led; + } + + public void setLed(LED led) { + this.led = led; + } + + public PLC getPlc() { + return plc; + } + + public void setPlc(PLC plc) { + this.plc = plc; + } + + public BlockingQueue getLicenseQueue() { + return licenseQueue; + } + + public void setLicenseQueue(BlockingQueue licenseQueue) { + this.licenseQueue = licenseQueue; + } + + public boolean isRunning() { + return running; + } + + public void setRunning(boolean running) { + this.running = running; + } + + public abstract String plcRod1Up(); // 抬闸 1 + + public abstract String plcSensor1Reset(); // 重置地感 1 + + public abstract String plcSensor1(); // 读地感 1 + + public void deviceInit() { + // 后续加入摄像头连不上的时候,可以手动加入 + // 摄像头没有连上 getLicenseQueue() 不为空,表示有手动加入车牌 + while (isRunning() && getLicenseQueue().isEmpty()) { + try { + getCamera().connect(); + + Thread.sleep(3000); + + if (getCamera() != null && getCamera().isConnected()) { // 等有心跳上报后,表示摄像头连上了 + break; + } + +// log.debug("等待车识连接 %s", getCamera().getId()); + Thread.sleep(3000); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + if(!isRunning()){ + log.debug("流程已终止"); + return; + } + + try { + getScale().connect(); + } catch (Exception e) { + log.error("%s %s 称连接失败", getWhich(), getScale().getId()); + log.error(e.getMessage(), e); + } + + try { + getLed().connect(); + } catch (IOException e) { + log.error("%s %s LED连接失败", getWhich(), getLed().getId()); + log.error(e.getMessage(), e); + } + + try { + if(!getPlc().isConnected()){ + getPlc().connect(); + } + } catch (IOException e) { + log.error("%s %s PLC连接失败", getWhich(), getPlc().getId()); + log.error(e.getMessage(), e); + } + } + +// public Boolean weightFlow(LicenseJPGPair pair) { +// try { +// // 将识别的到的车牌加入服务端队列 +// postLicenseQueue(getWhich(), getLicenseQueue()); +// +// PostLicenseResult postLicenseResult = postLicense(CliCacheData.SUP.getId(), pair.license, pair.file, getWhich()); +// +// if (postLicenseResult.isUploaded()) { +// if (postLicenseResult.getLicense() == null) { +// log.error("%s 车牌号数据错误", getWhich()); +// return null; +// } +// +// // 上传成功,但是服务端认为无权限 +// if (!postLicenseResult.isAccess()) { +// log.debug("%s 【%s】未授权或者有未处理完的记录", getWhich(), pair.license); +//// onLicenseResult(pair.license, pair.file, true, false); +// Thread.sleep(10000); +// return null; +// } +// } else { +// log.debug("%s 【%s】上传失败", getWhich(), pair.license); +// return null; +// } +// +// log.debug("%s 【%s】开始流程", getWhich(), pair.license); +// +// setCurrentLicense(pair.license); // 设定当前流程中的车辆 +// +// log.debug("%s 【%s】上磅前,控制LED显示", getWhich(), pair.license); +// try { +// getLed().screen(pair.license, "等待上磅", LEDInfoFormat); +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// } +// +// log.debug("%s 【%s】上磅,抬前闸", getWhich(), pair.license); +// try { +// getPlc().write(plcRod1Up()); +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// } +// +// try { +// getPlc().write(plcSensor1Reset()); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// +// log.debug("%s 【%s】上磅,等待地感线圈状态", getWhich(), pair.license); +// try { +// while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 +// if (getPlc().read(plcSensor1())) { +// break; +// } +// } +// } catch (IOException e) { +// log.debug("%s 【%s】上磅,PLC连接失败", getWhich(), pair.license); +// log.error(e.getMessage(), e); +// } +// +// // 重置流程,这个位置要重置地感线圈状态 +// if (getResetFlow()) { +// try { +// getPlc().write(plcSensor1Reset()); +// } catch (IOException e) { +// log.error(e.getMessage(), e); +// } +// setResetFlow(false); +// resetCurrentLicense(); +// log.debug("%s %s 重置流程", getWhich(), pair.license); +// return null; +// } +// +// log.debug("%s 【%s】上磅后,控制LED显示", getWhich(), pair.license); +// try { +// getLed().screen(pair.license, "开始称重", LEDInfoFormat); +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// } +// +// Thread.sleep(5000); // 获取到地感线圈状态后,等待 5 秒后开始称重 +// +// double weight = 0; +// int tryCount = 0; +// while (tryCount < 10 && !getResetFlow()) { +// try { +// if (!getScale().isConnected() && !getScale().connect()) { +// log.debug("%s 【%s】磅秤连接失败", getWhich(), pair.license); +// } else { +// weight = getScale().weigh30(); +// if (weight > 0) { +// log.debug("%s 【%s】称重结果【%s】", getWhich(), pair.license, weight); +// break; +// } +// } +// } catch (Exception e) { +// getScale().disconnect(); +// +// log.error(e.getMessage(), e); +// log.debug("%s 【%s】磅秤连接失败", getWhich(), pair.license); +// } +// tryCount++; +// } +// +// // 重置流程 +// if (getResetFlow()) { +// setResetFlow(false); +// resetCurrentLicense(); +// log.debug("%s %s 重置流程", getWhich(), pair.license); +// return null; +// } +// +// if (weight <= 0) { +// log.debug("%s 【%s】称重失败【%s】", getWhich(), pair.license, weight); +// } +// +// log.debug("%s 【%s】上磅后,控制LED显示称重结果【%s】", getWhich(), pair.license, weight); +// try { +// String weightStr; +// if (weight >= 100) { +// weightStr = String.format("%.1f", weight); +// } else { +// weightStr = String.format("%.2f", weight); +// } +// +// getLed().screen(pair.license, weightStr, LEDWeightFormat); +// } catch (IOException e) { +// log.error(e.getMessage(), e); +// log.debug("%s 【%s】控制LED显示称重结果失败【%s】", getWhich(), pair.license, weight); +// } +// +// log.debug("%s 【%s】称重后,上传重量【%s】", getWhich(), pair.license, weight); +// tryCount = 0; +// Boolean weightPosted = null; +// while (tryCount < 10) { +// if (weightPosted != null && weightPosted) { +// break; +// } +// weightPosted = postWeight(CliCacheData.SUP.getId(), pair.license, weight, getWhich()); +// tryCount++; +// Thread.sleep(500); +// } +// +// return weightPosted; +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// return false; +// } +// } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java new file mode 100644 index 0000000..dd43a57 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/InController.java @@ -0,0 +1,284 @@ +package com.cowr.local.ssjygl.devicectrl.controllers; + +import com.cowr.local.ssjygl.devicectrl.device.AbsScale; +import com.cowr.local.ssjygl.devicectrl.device.Camera; +import com.cowr.local.ssjygl.devicectrl.device.LED; +import com.cowr.local.ssjygl.devicectrl.device.PLC; +import com.cowr.local.ssjygl.devicectrl.utils.LicenseJPGPair; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.model.PostLicenseResult; +import com.jfinal.log.Log; + +import java.io.IOException; + +public class InController extends Controller implements Runnable { + private static Log log = Log.getLog(InController.class); + + public InController(String which, Camera camera, AbsScale scale, LED led, PLC plc) { + super(which, camera, scale, led, plc); + } + + @Override + public String plcRod1Up() { + return "rodIn1Up"; + } + + @Override + public String plcSensor1Reset() { + return "sensorIn1Reset"; + } + + @Override + public String plcSensor1() { + return "sensorIn1"; + } + + public void run() { + log.debug("开始 %s 流程", getWhich()); + deviceInit(); + + while (isRunning()) { + try { + // 出现错位等情况时,需要重置流程,重新开始 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); // 重置流程 + resetCurrentLicense(); // 重置当前流程中的车辆 + log.debug("【%s】 重置流程", getWhich()); + continue; + } + + // 初始化 LED 显示内容 + log.debug("等待入场车牌识别"); + try { + getLed().screen(" ", "等待车辆", LEDInfoFormat); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + // 接收到车牌号,开始入场流程 + LicenseJPGPair pair = getLicenseQueue().take(); + + // 出现错位等情况时,需要重置流程,重新开始 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); // 重置流程 + resetCurrentLicense(); // 重置当前流程中的车辆 + log.debug("%s 【%s】 重置流程", getWhich(), pair.license); + continue; + } + + // 将识别的到的车牌加入服务端队列 + postLicenseQueue(getWhich(), getLicenseQueue()); + + PostLicenseResult postLicenseResult = postLicense(CliCacheData.SUP.getId(), pair.license, pair.file, getWhich()); + + if (postLicenseResult.isUploaded()) { + if (postLicenseResult.getLicense() == null) { + log.error("%s 车牌号数据错误", getWhich()); + continue; + } + + // 上传成功,但是服务端认为无权限 + if (!postLicenseResult.isAccess()) { + log.debug("%s 【%s】未授权或者有未处理完的记录", getWhich(), pair.license); + continue; + } + } else { + log.debug("%s 【%s】上传失败", getWhich(), pair.license); + continue; + } + + log.debug("%s 【%s】开始流程", getWhich(), pair.license); + + setCurrentLicense(pair.license); // 设定当前流程中的车辆 + + log.debug("%s 【%s】上磅前,控制LED显示", getWhich(), pair.license); + try { + getLed().screen(pair.license, "等待上磅", LEDInfoFormat); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】上磅,抬前闸", getWhich(), pair.license); + + try { + getPlc().write(plcRod1Up()); // 抬闸 + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】上磅,重置地感线圈状态", getWhich(), pair.license); + + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】上磅,等待地感线圈状态", getWhich(), pair.license); + try { + while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + if (getPlc().read(plcSensor1())) { // 读取地感状态 + break; + } + } + } catch (IOException e) { + log.debug("%s 【%s】上磅,PLC连接失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + // 重置流程,这个位置要重置地感线圈状态 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); + resetCurrentLicense(); + log.debug("%s %s 重置流程", getWhich(), pair.license); + continue; + } + + log.debug("%s 【%s】上磅后,控制LED显示", getWhich(), pair.license); + try { + getLed().screen(pair.license, "开始称重", LEDInfoFormat); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + // 获取到地感线圈状态后,等待 5 秒后开始称重 + // 2020-07-23 调整为 2500,之前是 5000 + Thread.sleep(2500); + + double weight = 0; + int tryCount = 0; + while (tryCount < 10 && !getResetFlow()) { + try { + if (!getScale().isConnected()) { + log.debug("%s 【%s】磅秤连接断开,重连", getWhich(), pair.license); + getScale().connect(); + } + + weight = getScale().weigh15(); + if (weight > 0) { + log.debug("%s 【%s】称重结果【%s】", getWhich(), pair.license, weight); + break; + } + } catch (Exception e) { + getScale().disconnect(); + + log.error(e.getMessage(), e); + log.debug("%s 【%s】磅秤连接失败", getWhich(), pair.license); + } + tryCount++; + } + + // 重置流程 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); + resetCurrentLicense(); + log.debug("%s %s 重置流程", getWhich(), pair.license); + continue; + } + + if (weight <= 0) { + log.debug("%s 【%s】称重失败【%s】", getWhich(), pair.license, weight); + } + + log.debug("%s 【%s】上磅后,控制LED显示称重结果【%s】", getWhich(), pair.license, weight); + try { + String weightStr; + if (weight >= 100) { + weightStr = String.format("%.1f", weight); + } else { + weightStr = String.format("%.2f", weight); + } + + getLed().screen(pair.license, weightStr, LEDWeightFormat); + } catch (IOException e) { + log.error(e.getMessage(), e); + log.debug("%s 【%s】控制LED显示称重结果失败【%s】", getWhich(), pair.license, weight); + } + + log.debug("%s 【%s】称重后,上传重量【%s】", getWhich(), pair.license, weight); + tryCount = 0; + Boolean weightPosted = null; + while (tryCount < 10) { + tryCount++; + weightPosted = postWeight(CliCacheData.SUP.getId(), pair.license, weight, getWhich()); + if (weightPosted != null && weightPosted) { + break; + } + Thread.sleep(500); + } + + if (weightPosted != null && weightPosted) { + log.debug("%s 【%s】抬入场后闸", getWhich(), pair.license); + try { + getPlc().write("rodIn2Up"); + } catch (IOException e) { + log.error(e.getMessage(), e); + log.debug("%s 【%s】入场后闸,PLC连接失败", getWhich(), pair.license); + } + } else { + log.debug("%s 【%s】称重流程中断,跳出流程", getWhich(), pair.license); + continue; + } + + try { + getPlc().write("sensorIn2Reset"); + } catch (IOException e) { + log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】下磅,等待地感线圈状态", getWhich(), pair.license); + try { + while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + if (getPlc().read("sensorIn2")) { + break; + } + } + } catch (IOException e) { + log.debug("%s 【%s】下磅,PLC连接失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + if (getResetFlow()) { + try { + getPlc().write("sensorIn2Reset"); + } catch (IOException e) { + log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + setResetFlow(false); + resetCurrentLicense(); + continue; + } + + resetCurrentLicense(); + log.debug("%s 【%s】流程处理完毕", getWhich(), pair.license); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + log.debug("流程 %s 退出", this.getWhich()); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java new file mode 100644 index 0000000..af21d7c --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/controllers/OutController.java @@ -0,0 +1,281 @@ +package com.cowr.local.ssjygl.devicectrl.controllers; + +import com.cowr.local.ssjygl.devicectrl.device.AbsScale; +import com.cowr.local.ssjygl.devicectrl.device.Camera; +import com.cowr.local.ssjygl.devicectrl.device.LED; +import com.cowr.local.ssjygl.devicectrl.device.PLC; +import com.cowr.local.ssjygl.devicectrl.utils.LicenseJPGPair; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.model.PostLicenseResult; +import com.jfinal.log.Log; + +import java.io.IOException; + +public class OutController extends Controller implements Runnable { + private static Log log = Log.getLog(InController.class); + + public OutController(String which, Camera camera, AbsScale scale, LED led, PLC plc) { + super(which, camera, scale, led, plc); + } + + @Override + public String plcRod1Up() { + return "rodOut1Up"; + } + + @Override + public String plcSensor1Reset() { + return "sensorOut1Reset"; + } + + @Override + public String plcSensor1() { + return "sensorOut1"; + } + + public void run() { + log.debug("开始 %s 流程", getWhich()); + deviceInit(); + + while (isRunning()) { + try { + // 出现错位等情况时,需要重置流程,重新开始 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); // 重置流程 + resetCurrentLicense(); // 重置当前流程中的车辆 + log.debug("【%s】 重置流程", getWhich()); + continue; + } + + // 初始化 LED 显示内容 + log.debug("等待出场车牌识别"); + try { + getLed().screen(" ", "等待车辆", LEDInfoFormat); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + // 接收到车牌号,开始出场流程 + LicenseJPGPair pair = getLicenseQueue().take(); + + // 出现错位等情况时,需要重置流程,重新开始 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); // 重置流程 + resetCurrentLicense(); // 重置当前流程中的车辆 + log.debug("%s 【%s】 重置流程", getWhich(), pair.license); + continue; + } + + // 将识别的到的车牌加入服务端队列 + postLicenseQueue(getWhich(), getLicenseQueue()); + + PostLicenseResult postLicenseResult = postLicense(CliCacheData.SUP.getId(), pair.license, pair.file, getWhich()); + + if (postLicenseResult.isUploaded()) { + if (postLicenseResult.getLicense() == null) { + log.error("%s 车牌号数据错误", getWhich()); + continue; + } + + // 上传成功,但是服务端认为无权限 + if (!postLicenseResult.isAccess()) { + log.debug("%s 【%s】未授权或者有未处理完的记录", getWhich(), pair.license); + Thread.sleep(10000); + continue; + } + } else { + log.debug("%s 【%s】上传失败", getWhich(), pair.license); + continue; + } + + log.debug("%s 【%s】开始流程", getWhich(), pair.license); + + setCurrentLicense(pair.license); // 设定当前流程中的车辆 + + log.debug("%s 【%s】上磅前,控制LED显示", getWhich(), pair.license); + try { + getLed().screen(pair.license, "等待上磅", LEDInfoFormat); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】上磅,抬前闸", getWhich(), pair.license); + try { + getPlc().write(plcRod1Up()); // 抬闸 + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】上磅,重置地感线圈状态", getWhich(), pair.license); + + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】上磅,等待地感线圈状态", getWhich(), pair.license); + try { + while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + if (getPlc().read(plcSensor1())) { // 读地感状态 + break; + } + } + } catch (IOException e) { + log.debug("%s 【%s】上磅,PLC连接失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + // 重置流程,这个位置要重置地感线圈状态 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); + resetCurrentLicense(); + log.debug("%s %s 重置流程", getWhich(), pair.license); + continue; + } + + log.debug("%s 【%s】上磅后,控制LED显示", getWhich(), pair.license); + try { + getLed().screen(pair.license, "开始称重", LEDInfoFormat); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + // 获取到地感线圈状态后,等待 5 秒后开始称重 + // 2020-07-23 调整为 2500,之前是 5000 + Thread.sleep(2500); + + double weight = 0; + int tryCount = 0; + while (tryCount < 10 && !getResetFlow()) { + try { + if (!getScale().isConnected()) { + log.debug("%s 【%s】磅秤连接断开,重连", getWhich(), pair.license); + getScale().connect(); + } + + weight = getScale().weigh15(); + if (weight > 0) { + log.debug("%s 【%s】称重结果【%s】", getWhich(), pair.license, weight); + break; + } + } catch (Exception e) { + getScale().disconnect(); + + log.error(e.getMessage(), e); + log.debug("%s 【%s】磅秤连接失败", getWhich(), pair.license); + } + tryCount++; + } + + // 重置流程 + if (getResetFlow()) { + try { + getPlc().write(plcSensor1Reset()); // 重置地感状态 + } catch (IOException e) { + log.error(e.getMessage(), e); + } + setResetFlow(false); + resetCurrentLicense(); + log.debug("%s %s 重置流程", getWhich(), pair.license); + continue; + } + + if (weight <= 0) { + log.debug("%s 【%s】称重失败【%s】", getWhich(), pair.license, weight); + } + + log.debug("%s 【%s】上磅后,控制LED显示称重结果【%s】", getWhich(), pair.license, weight); + try { + String weightStr; + if (weight >= 100) { + weightStr = String.format("%.1f", weight); + } else { + weightStr = String.format("%.2f", weight); + } + + getLed().screen(pair.license, weightStr, LEDWeightFormat); + } catch (IOException e) { + log.error(e.getMessage(), e); + log.debug("%s 【%s】控制LED显示称重结果失败【%s】", getWhich(), pair.license, weight); + } + + log.debug("%s 【%s】称重后,上传重量【%s】", getWhich(), pair.license, weight); + tryCount = 0; + Boolean weightPosted = null; + while (tryCount < 10) { + tryCount++; + weightPosted = postWeight(CliCacheData.SUP.getId(), pair.license, weight, getWhich()); + if (weightPosted != null && weightPosted) { + break; + } + Thread.sleep(500); + } + + if (weightPosted != null && weightPosted) { + // 出场时,称完重量后,就等待用户结算,然后发送抬杆指令,这里不自动抬杆 + log.debug("%s 【%s】等待结算", getWhich(), pair.license); + } else { + if (weightPosted == null) { + log.debug("%s 【%s】上传车重失败", getWhich(), pair.license); + continue; + } else { + log.debug("%s 【%s】上传车重数据不正确", getWhich(), pair.license); + } + } + + try { + getPlc().write("sensorOut2Reset"); + } catch (IOException e) { + log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + log.debug("%s 【%s】下磅,等待地感线圈状态", getWhich(), pair.license); + try { + while (!getResetFlow()) { // 流程没有被重置,就一直等待地感线圈状态 + if (getPlc().read("sensorOut2")) { + break; + } + } + } catch (IOException e) { + log.debug("%s 【%s】下磅,PLC连接失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + + if (getResetFlow()) { + try { + getPlc().write("sensorOut2Reset"); + } catch (IOException e) { + log.debug("%s 【%s】 重置地感线圈状态失败", getWhich(), pair.license); + log.error(e.getMessage(), e); + } + setResetFlow(false); + resetCurrentLicense(); + continue; + } + + resetCurrentLicense(); + log.debug("%s 【%s】流程处理完毕", getWhich(), pair.license); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/AbsScale.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/AbsScale.java new file mode 100644 index 0000000..f55d3a7 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/AbsScale.java @@ -0,0 +1,71 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import com.jfinal.log.Log; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.concurrent.locks.ReentrantLock; +import java.util.regex.Pattern; + +public abstract class AbsScale extends Device { + private static Log log = Log.getLog(AbsScale.class); + private ReentrantLock lock = new ReentrantLock(); + protected Socket socket; + public static Pattern pattern = Pattern.compile("(\\d+\\.?\\d*)"); + + public AbsScale(String id, String ip, int port) { + super(id, ip, port); + } + + public boolean connect() throws IOException { + lock.lock(); + try { + socket = new Socket(); + socket.setSoTimeout(1000); + socket.connect(new InetSocketAddress(getIp(), getPort()), 3000); + + return true; + } finally { + lock.unlock(); + } + } + + public boolean isConnected() { + return socket != null && socket.isConnected() && !socket.isClosed(); + } + + public void disconnect() { + try { + log.debug("销毁称重连接"); + if(socket != null){ + socket.close(); + socket = null; + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + socket = null; + } + + public abstract double weigh() throws IOException; + + // 2020-07-23 调整为 15 次,之前是 30次 + public abstract double weigh15() throws IOException; + + public String flip(String max) { + char[] chars = max.toCharArray(); + char[] newChars = new char[chars.length]; + for (int i = 0; i < newChars.length; i++) { + newChars[i] = chars[chars.length - i - 1]; + } + + String out = new String(newChars); + + if (pattern.matcher(out).matches()) { + return out; + } + + return "0"; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Camera.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Camera.java new file mode 100644 index 0000000..df80712 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Camera.java @@ -0,0 +1,50 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import com.cowr.local.ssjygl.devicectrl.controllers.Controller; + +public class Camera extends Device { + public static final int TIME_OUT = 15000; // 单位毫秒 + + private Controller controller; + private boolean isconnected = false; + private long keeptime = 0; + + public Camera(String id, String ip) { + super(id, ip); + + this.keeptime = System.currentTimeMillis(); + } + + public boolean connect() { + return isconnected; + } + + public void setIsconnected(boolean isconnected) { + this.isconnected = isconnected; + } + + @Override + public boolean isConnected() { + return isconnected; + } + + public void disconnect() { + isconnected = false; + } + + public long getKeeptime() { + return keeptime; + } + + public void setKeeptime(long keeptime) { + this.keeptime = keeptime; + } + + public Controller getController() { + return controller; + } + + public void setController(Controller controller) { + this.controller = controller; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/CameraController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/CameraController.java new file mode 100644 index 0000000..451f422 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/CameraController.java @@ -0,0 +1,118 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import com.alibaba.fastjson.JSONObject; +import com.cowr.common.utils.ImageUtil; +import com.cowr.local.ssjygl.devicectrl.common.Const; +import com.cowr.local.ssjygl.main.AuthInterceptor; +import com.cowr.local.ssjygl.main.Config; +import com.jfinal.aop.Clear; +import com.jfinal.core.Controller; +import com.jfinal.kit.HttpKit; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import java.io.File; + +@Clear(AuthInterceptor.class) +public class CameraController extends Controller { + private static Log log = Log.getLog(CameraController.class); + + public void index() { + renderJson("ret", true); + } + + public void recv() { + try { + String str = HttpKit.readData(getRequest()); + + if(StrKit.isBlank(str)){ + renderJson(new JSONObject().fluentPut("ret", false).fluentPut("msg", "readData 解析失败")); + return; + } + + JSONObject json = JSONObject.parseObject(str); + + if(json == null){ + renderJson(new JSONObject().fluentPut("ret", false).fluentPut("msg", "parseObject 解析失败")); + return; + } + + String romid = null; + String sn = null; + String ipaddr = null; + + if (json.containsKey("KeepAlive")) { // 心跳数据 + JSONObject keepAlive = json.getJSONObject("KeepAlive"); + + ipaddr = keepAlive.getString("ipaddr"); + sn = keepAlive.getString("SN"); + romid = keepAlive.getString("ROMID"); + + Camera camera = Config.deviceThread.getCameraByIp(ipaddr); + + if (camera == null) { + renderJson(new JSONObject().fluentPut("ROMID", romid).fluentPut("sn", sn).fluentPut("ipaddr", ipaddr)); + return; + } + + // 长时间没有心跳数据后,怎么处理? +// log.debug("相机 %s %s 心跳", camera.getId(), camera.getIp()); + + camera.setIsconnected(true); + camera.setKeeptime(System.currentTimeMillis()); + } else if (json.containsKey("AlarmInfoPlate")) { + JSONObject alarmInfoPlate = json.getJSONObject("AlarmInfoPlate"); + JSONObject result = alarmInfoPlate.getJSONObject("result"); + JSONObject plateResult = result.getJSONObject("PlateResult"); + String license = plateResult.getString("license"); + String imageFile = plateResult.getString("imageFile"); + + if(StrKit.isBlank(license)){ + log.error("无效车牌:【%s】", license); + renderJson(new JSONObject().fluentPut("ret", false).fluentPut("msg", "无效车牌")); + return; + } + + ipaddr = alarmInfoPlate.getString("ipaddr"); + sn = alarmInfoPlate.getString("sn"); + romid = alarmInfoPlate.getString("romid"); + + File jpgFile = new File( + String.format("%s%s%s-%d.jpg", + Config.getRootPath() + File.separator + Const.LicenseImgTmpFolder, + File.separator, + license, + System.currentTimeMillis() + ) + ); + + boolean ret = ImageUtil.generateImage(imageFile, jpgFile); + + if (!ret) { + log.error("数据解析失败:%s", str); + renderJson(new JSONObject().fluentPut("ret", false).fluentPut("msg", "解析图片失败")); + return; + } + + // 示例中有个空格,要去掉 + license = license.replace(" ", ""); + + Camera camera = Config.deviceThread.getCameraByIp(ipaddr); + + log.debug("识别成功:%s, %s", license, jpgFile); + + if(camera != null){ + camera.getController().onLicenseResult(license, jpgFile); // 识别到图片,回调 + }else{ + log.error("摄像头配置异常 %s", ipaddr); + } + }else { + log.debug("无效 json 数据 %s", json.toJSONString()); + } + + renderJson(new JSONObject().fluentPut("ROMID", romid).fluentPut("sn", sn).fluentPut("ipaddr", ipaddr)); + } catch (Exception e) { + log.error(e.getMessage(), e); + renderJson(new JSONObject().fluentPut("ret", false).fluentPut("msg", "解析失败")); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Device.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Device.java new file mode 100644 index 0000000..19a4a89 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Device.java @@ -0,0 +1,50 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import java.io.IOException; + +public abstract class Device { + private String id; + private String ip; + private int port; + + public Device(String id, String ip) { + this.id = id; + this.ip = ip; + } + + public Device(String id, String ip, int port) { + this.id = id; + this.ip = ip; + this.port = port; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public abstract boolean connect() throws IOException; + + public abstract boolean isConnected(); + + public abstract void disconnect(); +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/HuangZhouScale.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/HuangZhouScale.java new file mode 100644 index 0000000..de60790 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/HuangZhouScale.java @@ -0,0 +1,125 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +public class HuangZhouScale extends AbsScale { + public HuangZhouScale(String id, String ip, int port) { + super(id, ip, port); + } + + @Override + public double weigh() throws IOException { + InputStream inputStream = socket.getInputStream(); + byte[] clearBuf = new byte[inputStream.available()]; + inputStream.read(clearBuf); + int errCount = 0; + + String weight = "0.0"; + while (true) { + if (errCount >= 10) { + break; + } + + errCount++; + + byte[] buf = new byte[9]; + int read = inputStream.read(buf); + + if (read != 9) { + continue; + } + + weight = flip(new String(Arrays.copyOfRange(buf, 1, buf.length))); + break; + } + + return Double.parseDouble(weight) / 1000d; + } + + @Override + public double weigh15() throws IOException { + ArrayList list = new ArrayList<>(); + AtomicBoolean run = new AtomicBoolean(true); + + InputStream inputStream = socket.getInputStream(); + byte[] clearBuf = new byte[inputStream.available()]; + inputStream.read(clearBuf); + int errCount = 0; + + while (run.get() && list.size() < 15) { + long st = System.currentTimeMillis(); + + byte[] buf = new byte[9]; + int read = inputStream.read(buf); + + if (read != 9 && errCount < 10) { + errCount++; + continue; + } + + String weight = new String(Arrays.copyOfRange(buf, 1, buf.length)); + + if (!pattern.matcher(weight).matches() || weight.equals("000000")) { +// System.out.println("error:" + weight); + + if (errCount == 100) { + break; + } + errCount++; + continue; + } + + System.out.println("读一次耗时:" + (System.currentTimeMillis() - st) + ", " + Double.parseDouble(flip(weight))); + list.add(flip(weight)); + } + + String max = "0"; + if (list.size() > 0) { + Map collect = list.stream().collect( + Collectors.groupingBy(num -> num, Collectors.counting())); + max = collect.entrySet().stream().max(Comparator.comparingLong(Map.Entry::getValue)).get().getKey(); + } + + return Double.parseDouble(max) / 1000d; + } + + + public static void main(String[] args) { + HuangZhouScale s = new HuangZhouScale("scale", "192.168.0.189", 10001); + + try { + boolean connect = s.connect(); + System.out.println("connect " + connect); + } catch (IOException e) { + e.printStackTrace(); + } + + long st = System.currentTimeMillis(); + + for (int i = 0; i < 100; i++) { + try { + st = System.currentTimeMillis(); + double weigh = s.weigh15(); + System.out.println("end:" + weigh + ", tm: " + (System.currentTimeMillis() - st)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } catch (IOException e) { + e.printStackTrace(); + } +// break; + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LED.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LED.java new file mode 100644 index 0000000..60b04be --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/LED.java @@ -0,0 +1,213 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import com.jfinal.log.Log; + +import java.io.IOException; +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.locks.ReentrantLock; + +public class LED extends Device { + private static Log log = Log.getLog(LED.class); + private static String textFormat = "%s\\n%s\\n%s"; + + private static final ThreadLocal sdf = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("MM-dd HH:mm"); + } + }; + + private ReentrantLock lock = new ReentrantLock(); + protected Socket socket; + + public LED(String id, String ip, int port) { + super(id, ip, port); + } + + public void screen(String license, String text, String format) throws IOException { + lock.lock(); + try { + if (license == null) { + return; + } + + // 重连一次 + if(!isConnected()){ + connect(); + } + +// if (weightStr.length() != 6) { +// throw new IllegalArgumentException(); +// } + + String date = sdf.get().format(new Date()); + String dataStr = String.format(format, date, license, text); + byte[] data = dataStr.getBytes(Charset.forName("gb2312")); + int dataLen = data.length; + byte[] msg = new byte[frameHead.length + packetHead.length + b.length + dataLen]; + System.arraycopy(frameHead, 0, msg, 0, frameHead.length); +// System.out.println(HexDump.toHex(msg)); + packetHead[packetHead.length - 2] = (byte) (b.length + dataLen); + System.arraycopy(packetHead, 0, msg, frameHead.length, packetHead.length); +// System.out.println(HexDump.toHex(msg)); + int areaLen = b.length - 9 + dataLen; + b[7] = (byte) areaLen; + b[32] = (byte) dataLen; + System.arraycopy(b, 0, msg, packetHead.length + frameHead.length, b.length); +// System.out.println(HexDump.toHex(msg)); + System.arraycopy(data, 0, msg, packetHead.length + frameHead.length + b.length, dataLen); +// System.out.println(HexDump.toHex(msg)); + + byte[] toCrc = new byte[msg.length - 8]; + System.arraycopy(msg, 8, toCrc, 0, toCrc.length); + int crc = CalcCRC(toCrc, toCrc.length); + + byte[] msgCrc = new byte[msg.length + 3]; + System.arraycopy(msg, 0, msgCrc, 0, msg.length); +// System.out.println(HexDump.toHex(msgCrc)); + msgCrc[msgCrc.length - 2] = (byte) (crc >> 8); + msgCrc[msgCrc.length - 3] = (byte) crc; + msgCrc[msgCrc.length - 1] = frameTail; +// System.out.println(HexDump.toHex(msgCrc)); + + socket.getOutputStream().write(msgCrc); + socket.getOutputStream().flush(); + + InputStream in = socket.getInputStream(); + byte[] buf = new byte[in.available()]; + in.read(buf); +// BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); +// byte[] y = new byte[128]; +// int read = bis.read(y); +// while (!(read > 0)) { +// read = bis.read(y); +// } +// byte[] z = new byte[read]; +// System.arraycopy(y, 0, z, 0, read); +// System.out.println(HexDump.toHex(z)); + socket.close(); + } finally { + lock.unlock(); + } + } + + private static byte[] frameHead = new byte[]{(byte) 0xa5, (byte) 0xa5, (byte) 0xa5, (byte) 0xa5, (byte) 0xa5, (byte) 0xa5, (byte) 0xa5, (byte) 0xa5}; + private static byte[] packetHead = new byte[]{ + (byte) 0xfe, (byte) 0xff,//屏号 + 0x00, (byte) 0x80, //客户端 + 0x00, 0x00, 0x00, //Reserved + 0x00, //option + 0x00, //CheckMode + 0x00,//DisplayMode + 0x61, //设备型号 + 0x02,//协议版本 + 0x00, 0x00//datalen + }; + private static byte[] b = new byte[]{ + (byte) 0xa3,//指令分组,发送实时显示区域数据 + 0x06,//结合上一个 + 0x01,//0x01需要回复,0x02不用回复 + 0x00,//ProcessMode,无用 + 0x00,//Reserved + 0x00,//删除编号区域,无用 + 0x01,//本次命令更新区域个数 + 0x00, 0x00,//区域0数据长度动态计算,下标9~len-1 + //区域0数据 + 0x00,//AreaType,未知 + 0x00, (byte) 0x80, //AreaX + 0x00, 0x00, //AreaY + 0x60, (byte) 0x80,//width + 0x30, 0x00,//height + 0x00,//DynamicAreaLoc + 0x00,//Lines_sizes + 0x01,//Runmode + 0x02, 0x00, //timeout + 0x00,//sound mode + 0x00, 0x00,////Reserved + 0x02,//多行,0x01单行 + 0x01,//手动换行 + 0x02,//display mod 静止 + 0x00,//exit mod + 0x02,//speed + 0x00,//stay time + 0x00, 0x00, 0x00, 0x00,//data len, 下标31,32,33,34 + //data + //...区域n数据长度,区域n数据,无用 + }; + private static byte[] ping = new byte[]{ + 0x05, 0x00,//长度 + (byte) 0xa2, + 0x00, + 0x01, + 0x00, 0x00 + }; + private static byte frameTail = 0x5a; + + + private static int CRC(int crc, byte b) { + return (((crc) >> 8) ^ tabel[((crc) ^ (int) (b)) & 0XFF]); + } + + private static int[] tabel = new int[]{0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241, 0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440, 0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40, 0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841, 0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40, 0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41, 0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641, 0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040, 0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240, 0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441, 0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41, 0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840, 0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41, 0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40, 0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640, 0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041, 0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240, 0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441, 0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41, 0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840, 0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41, 0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40, 0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640, 0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041, 0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241, 0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440, 0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40, 0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841, + + 0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40, 0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41, 0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641, 0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040}; + + private static int CalcCRC(byte[] data, int size) { + int i; + int crc = 0; + for (i = 0; i < size; i++) { + crc = CRC(crc, data[i]); + } + return crc; + } + + @Override + public boolean connect() throws IOException { + lock.lock(); + try { + socket = new Socket(); + socket.setSoTimeout(1000); + socket.connect(new InetSocketAddress(getIp(), getPort()), 3000); + } finally { + lock.unlock(); + } + + return isConnected(); + } + + @Override + public boolean isConnected() { + return socket != null && socket.isConnected() && !socket.isClosed(); + } + + @Override + public void disconnect() { + try { + log.debug("销毁LED连接"); + if(socket != null){ + socket.close(); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + socket = null; + } + + public static void main(String[] args) { + try { + LED led = new LED("", "192.168.0.197", 5005); + led.screen("12345678", "等待车辆", "%s\\n %s \\n%s"); + + Thread.sleep(3000); + + led.screen("987654321", "等待车辆", "%s\\n %s \\n%s"); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java new file mode 100644 index 0000000..205ed62 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/PLC.java @@ -0,0 +1,275 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import com.cowr.local.ssjygl.devicectrl.utils.CRC16; +import com.jfinal.log.Log; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; + +public class PLC extends Device { + private static Log log = Log.getLog(PLC.class); + private static byte[] presetRead = new byte[]{ + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x06,//后续长 + 0x01,//站号 + 0x03,//功能码 + 0x00, 0x00,//寄存器地址 + 0x00, 0x01//读取个数 + }; + private static byte[] presetWrite = new byte[]{ + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x06,//后续长 + 0x01,//站号 + 0x06,//功能码 + 0x00, 0x00,//寄存器地址 + 0x00, 0x00//写值 + }; + + private static int plcSleepInterval = 150; + + private Map addressTable; + private Socket socket; + private ReentrantLock lock = new ReentrantLock(true); + private ReentrantLock glock = new ReentrantLock(true); + + public PLC(String id, String ip, int port, Map addressTable) { + super(id, ip, port); + + this.addressTable = addressTable; + } + + public Map getAddressTable() { + return addressTable; + } + + public void setAddressTable(Map addressTable) { + this.addressTable = addressTable; + } + + public boolean connect() throws IOException { + if (this.socket == null || !this.socket.isConnected()) { + lock.lock(); + try { + Socket socket = new Socket(); + socket.setOOBInline(false); + socket.setTcpNoDelay(true); + socket.setReuseAddress(false);//default false + socket.setSoLinger(false, 0); + socket.setKeepAlive(true); + socket.setSoTimeout(3000); + socket.connect(new InetSocketAddress(getIp(), getPort()), 3000); + + int crc = CRC16.calcCrc16(presetRead); + byte[] data = new byte[presetRead.length + 2]; + System.arraycopy(presetRead, 0, data, 0, presetRead.length); + data[data.length - 2] = (byte) (crc >> 8); + data[data.length - 1] = (byte) crc; + + OutputStream outputStream = socket.getOutputStream(); + outputStream.write(presetRead); + outputStream.flush(); + + InputStream inputStream = socket.getInputStream(); + byte[] buf = new byte[11]; + int read = inputStream.read(buf); + if (read == 11) { + this.socket = socket; + } + + log.debug("plc连接成功"); + return true; + } finally { + lock.unlock(); + } + } + + return false; + } + + public boolean isConnected() { + lock.lock(); + try { + boolean f = this.socket != null && this.socket.isConnected() && !this.socket.isClosed(); + if (!f) { + log.debug("PLC 未连接或者连接已断开, %s", f); + return false; + } + plcWrite("ping", (byte) 1, presetRead); + sleep(); + return plcClear() > 0; + } catch (IOException e) { + log.error(e.getMessage(), e); + } finally { + lock.unlock(); + } + + return false; + } + + public void disconnect() { + log.debug("销毁PLC连接开始"); + + try { + log.debug("销毁PLC 1 " + (socket != null)); + log.debug("销毁PLC 2 " + (socket != null && socket.isConnected())); + log.debug("销毁PLC 3 " + (socket != null && !socket.isClosed())); + + if (socket != null && socket.isConnected() && !socket.isClosed()) { + socket.close(); + socket = null; + } + } catch (IOException e) { + System.out.println("销毁PLC IOException"); + log.error(e.getMessage(), e); + } + + log.debug("销毁PLC连接完成"); + } + + void sleep() { + try { + Thread.sleep(plcSleepInterval); + } catch (InterruptedException ignore) { + } + } + + void plcWrite(String address, byte data, byte[] framePreset) throws IOException { + lock.lock(); + try { + if (addressTable.containsKey(address)) { + byte addr = addressTable.get(address); + byte[] frame = new byte[framePreset.length]; + System.arraycopy(framePreset, 0, frame, 0, presetWrite.length); + frame[9] = addr; + frame[11] = data; + + socket.getOutputStream().write(frame); + }else{ + log.error("PLC 未找到指令【%s】", address); + } + } finally { + lock.unlock(); + } + } + + /** + * 读取一帧,返回帧最后一个字节 + * 返回-1表示缓冲中无数据可读,返回0或大于0为帧最后一字节值 + */ + int plcRead() throws IOException { + lock.lock(); + try { + InputStream in = socket.getInputStream(); + if (in.available() >= 6) { + byte[] buf = new byte[6]; + in.read(buf); + int len = buf[5]; + buf = new byte[len]; + in.read(buf); + return buf[buf.length - 1]; + } else { + return -1; + } + } finally { + lock.unlock(); + } + } + + /** + * 清空缓冲数据 + */ + int plcClear() throws IOException { + lock.lock(); + try { + InputStream inputStream = socket.getInputStream(); + int available = inputStream.available(); + byte[] buf = new byte[available]; + return inputStream.read(buf); + } finally { + lock.unlock(); + } + } + + /** + * 抬闸, address=[rodIn1Up | rodIn2Up | rodOut1Up | rodOut2Up] + * 重置地感线圈 + */ + public void write(String address) throws IOException { +// log.debug("PLC write start " + address); + + glock.lock(); + try { + if (!isConnected()) { + disconnect(); + sleep(); + connect(); + } + + plcWrite(address, (byte) 1, presetWrite); + sleep(); + plcWrite(address, (byte) 0, presetWrite); + sleep(); + plcClear(); + sleep(); + } finally { + glock.unlock(); +// log.debug("PLC write end " + address); + } + } + + /** + * 有车出发光感,address=[laserIn | laserOut] + * 有车经过地感线圈,address=[sensorIn1 | sensorIn2 | sensorOut1 | sensorOut2] + */ + public boolean read(String address) throws IOException { +// try { +// Thread.sleep(10000); +// } catch (Exception ignored) { +// +// } +// return true; // TODO: 开发调试,直接返回 true + + glock.lock(); + try { + if (!isConnected()) { + disconnect(); + sleep(); + connect(); + } + + plcWrite(address, (byte) 1, presetRead); + sleep(); + boolean on = plcRead() == 1; + sleep(); + return on; + } finally { + glock.unlock(); + } + } + + public static void main(String[] args) { + try { + PLC plc = new PLC("_plc", "192.168.0.220", 502, com.cowr.local.ssjygl.devicectrl.common.DeviceThread.defaultAddressTable); + plc.connect(); + plc.isConnected(); + plc.write("rodOut1Up"); +// plc.write("rodOut2Up"); + +// plc.write("sensorIn2Reset"); +// plc.write("sensorOut1Reset"); +// plc.write("sensorOut2Reset"); + +// plc.write("sensorOut2Reset"); +// System.out.println("sensorOut2:" + plc.read("sensorOut2")); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Printer.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Printer.java new file mode 100644 index 0000000..c9796f7 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/device/Printer.java @@ -0,0 +1,76 @@ +package com.cowr.local.ssjygl.devicectrl.device; + +import java.io.*; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.concurrent.locks.ReentrantLock; + +public class Printer { + private String ip; + private int port; + private ReentrantLock lock = new ReentrantLock(true); + + public Printer(String ip, int port) { + this.ip = ip; + this.port = port; + } + + public void print(File file) throws IOException { + if (file == null || !file.exists()) { + return; + } + lock.lock(); + try { + Socket socket = new Socket(); + socket.setOOBInline(false); + socket.setTcpNoDelay(true); + socket.setReuseAddress(false);//default false + socket.setSoLinger(false, 0); + socket.setKeepAlive(false); + socket.setSoTimeout(15000); + socket.connect(new InetSocketAddress(ip, port), 3000); + + FileInputStream fis = new FileInputStream(file); + OutputStream out = socket.getOutputStream(); + int l1 = (int) (file.length() >> 56); + int l2 = (int) (file.length() >> 48); + int l3 = (int) (file.length() >> 40); + int l4 = (int) (file.length() >> 32); + int l5 = (int) (file.length() >> 24); + int l6 = (int) (file.length() >> 16); + int l7 = (int) (file.length() >> 8); + int l8 = (int) file.length(); + out.write(l1); + out.write(l2); + out.write(l3); + out.write(l4); + out.write(l5); + out.write(l6); + out.write(l7); + out.write(l8); + out.flush(); + byte[] buf = new byte[1024]; + + while (true) { + int read = fis.read(buf); + if (read == -1) { + break; + } + out.write(buf, 0, read); + out.flush(); + } + fis.close(); + + InputStream in = socket.getInputStream(); + while (true) { + int i = in.read(); + if (i != 0) { + break; + } + } + socket.close(); + } finally { + lock.unlock(); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/CellAddresses.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/CellAddresses.java new file mode 100644 index 0000000..a35c623 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/CellAddresses.java @@ -0,0 +1,117 @@ +package com.cowr.local.ssjygl.devicectrl.printer; + +import org.apache.poi.ss.util.CellAddress; + +import java.util.HashMap; +import java.util.Map; + +// 保存预设的发票内容单元格位置 +public class CellAddresses { + // 二维码 + public static final CellAddress qrcode = makeCellAddress("b1"); + // 单号 + public static final CellAddress serial = makeCellAddress("j2"); + // 开票时间 + public static final CellAddress datetimePrint = makeCellAddress("m4"); + // 客户名称 + public static final CellAddress clientName = makeCellAddress("c6"); + // 客户纳税人识别号 + public static final CellAddress clientTaxId = makeCellAddress("c7"); + // 客户地址、电话 + public static final CellAddress clientContact = makeCellAddress("c8"); + // 客户开户行及账号 + public static final CellAddress clientBankInfo = makeCellAddress("c9"); + // 运输公司名称及车牌号 + public static final CellAddress haulerName = makeCellAddress("i7"); + // 运输公司纳税人识别号 + public static final CellAddress haulerTaxId = makeCellAddress("i6"); + // 运输公司地址、电话 + public static final CellAddress haulerContact = makeCellAddress("i8"); + // 运输公司开户行及账号 + public static final CellAddress haulerBankInfo = makeCellAddress("i9"); + // 起点 + public static final CellAddress origin = makeCellAddress("b10"); + // 终点 + public static final CellAddress dest = makeCellAddress("h10"); + // 品名 + public static final CellAddress goodsName = makeCellAddress("a13"); + // 净重 + public static final CellAddress goodsNetWeight = makeCellAddress("e15"); + + // 皮重 + public static final CellAddress goodsTareWeight = makeCellAddress("e13"); + // 毛重 + public static final CellAddress goodsGrossWeight = makeCellAddress("e11"); + + // 运输距离 + public static final CellAddress transDistance = makeCellAddress("e17"); + // 商品单价 + public static final CellAddress priceGoods = makeCellAddress("h12"); + // 商品总价小写 + public static final CellAddress priceGoodsTotal = makeCellAddress("k11"); + // 商品总价大写 + public static final CellAddress priceGoodsTotalUpper = makeCellAddress("k13"); + // 运输单价 + public static final CellAddress priceTrans = makeCellAddress("h16"); + // 运输总价小写 + public static final CellAddress priceTransTotal = makeCellAddress("k15"); + // 运输总价大写 + public static final CellAddress priceTransTotalUpper = makeCellAddress("k17"); + // 销售方 + public static final CellAddress vendor = makeCellAddress("c19"); + // 销售方纳税人识别号 + public static final CellAddress vendorTaxId = makeCellAddress("c21"); + // 备注 + public static final CellAddress remark = makeCellAddress("h19"); + // 开票人 + public static final CellAddress drawer = makeCellAddress("g23"); + // 配送公司 + public static final CellAddress haulerCo = makeCellAddress("k23"); + + public static Map addrMap = new HashMap<>(); + + static { +// addrMap.put("serial", serial); + addrMap.put("datatimePrint", datetimePrint); + addrMap.put("clientName", clientName); + addrMap.put("clientTaxId", clientTaxId); + addrMap.put("clientContact", clientContact); + addrMap.put("clientBankInfo", clientBankInfo); + addrMap.put("haulerName", haulerName); + addrMap.put("haulerTaxId", haulerTaxId); + addrMap.put("haulerContact", haulerContact); + addrMap.put("haulerBankInfo", haulerBankInfo); + addrMap.put("origin", origin); + addrMap.put("dest", dest); + addrMap.put("goodsName", goodsName); + addrMap.put("goodsNetWeight", goodsNetWeight); + addrMap.put("goodsTareWeight", goodsTareWeight); + addrMap.put("goodsGrossWeight", goodsGrossWeight); + addrMap.put("transDistance", transDistance); + addrMap.put("priceGoods", priceGoods); + addrMap.put("priceGoodsTotal", priceGoodsTotal); + addrMap.put("priceGoodsTotalUpper", priceGoodsTotalUpper); + addrMap.put("priceTrans", priceTrans); + addrMap.put("priceTransTotal", priceTransTotal); + addrMap.put("priceTransTotalUpper", priceTransTotalUpper); + addrMap.put("vendor", vendor); + addrMap.put("vendorTaxId", vendorTaxId); + addrMap.put("remark", remark); + addrMap.put("drawer", drawer); + addrMap.put("haulerCo", haulerCo); + } + + private static CellAddress makeCellAddress(String addr) { + char[] chars = addr.toCharArray(); + int column = chars[0] - 97; + int row; + String sub = addr.substring(1, addr.length()); + row = Integer.valueOf(sub) - 1; + // if (chars.length == 3) { + // row = 10 + (chars[2] - 48 - 1) * 10; + // } else { + // row = chars[1] - 48 - 1; + // } + return new CellAddress(row, column); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java new file mode 100644 index 0000000..52c0cc2 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/printer/ExcelHelper.java @@ -0,0 +1,113 @@ +package com.cowr.local.ssjygl.devicectrl.printer; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.Set; + +public class ExcelHelper { + static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + public static Workbook genExcel(Map model, File tplFile) throws IOException { + long st = System.currentTimeMillis(); + Workbook workbook = XSSFWorkbookFactory.create(tplFile); + System.out.println("读取模板耗时:" + ( System.currentTimeMillis() - st )); + Sheet sheet = workbook.getSheetAt(0); + + Set> entrySet = CellAddresses.addrMap.entrySet(); + for (Map.Entry entry : entrySet) { + Object val = model.get(entry.getKey()); + if (val == null) { + continue; + } + CellAddress addr = entry.getValue(); + getCell(getRow(sheet, addr.getRow()), addr.getColumn()).setCellValue(val.toString()); + } + + String now = sdf.format(new Date()); + getCell(getRow(sheet, CellAddresses.datetimePrint.getRow()), CellAddresses.datetimePrint.getColumn()).setCellValue(now); + + return workbook; + } + + public static Row getRow(Sheet sheet, int i){ + Row row = sheet.getRow(i); + + if(row == null){ + row = sheet.createRow(i); + } + + return row; + } + + public static Cell getCell(Row row, int i){ + Cell cell = row.getCell(i); + + if(cell == null){ + cell = row.createCell(i); + } + + return cell; + } + + public class Model { + //二维码 + private String qrcode; + //单号 + private String serial ; + //开票时间 + private String datetimePrint; + //客户名称 + private String clientName; + //客户纳税人识别号 + private String clientTaxId; + //客户地址、电话 + private String clientContact; + //客户开户行及账号 + private String clientBankInfo; + //运输公司名称及车牌号 + private String haulerName; + //运输公司纳税人识别号 + private String haulerTaxId; + //运输公司地址、电话 + private String haulerContact; + //运输公司开户行及账号 + private String haulerBankInfo; + //起点 + private String origin; + //终点 + private String dest; + //品名 + private String goodsName; + //净重 + private String goodsNetWeight; + //运输距离 + private String transDistance; + //商品单价 + private String priceGoods; + //商品总价小写 + private String priceGoodsTotal; + //商品总价大写 + private String priceGoodsTotalUpper; + //运输单价 + private String priceTrans; + //运输总价小写 + private String priceTransTotal; + //运输总价大写 + private String priceTransTotalUpper; + //销售方 + private String vendor; + //销售方纳税人识别号 + private String vendorTaxId; + //备注 + private String remark; + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/CRC16.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/CRC16.java new file mode 100644 index 0000000..b6b6fbd --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/CRC16.java @@ -0,0 +1,58 @@ +package com.cowr.local.ssjygl.devicectrl.utils; + +public class CRC16 { + private static byte[] crc16_tab_h = {(byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, + (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, + (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, + (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, + (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40}; + + private static byte[] crc16_tab_l = {(byte) 0x00, (byte) 0xC0, (byte) 0xC1, (byte) 0x01, (byte) 0xC3, (byte) 0x03, (byte) 0x02, (byte) 0xC2, (byte) 0xC6, (byte) 0x06, (byte) 0x07, (byte) 0xC7, (byte) 0x05, (byte) 0xC5, (byte) 0xC4, (byte) 0x04, (byte) 0xCC, (byte) 0x0C, (byte) 0x0D, (byte) 0xCD, (byte) 0x0F, (byte) 0xCF, (byte) 0xCE, (byte) 0x0E, (byte) 0x0A, (byte) 0xCA, (byte) 0xCB, (byte) 0x0B, (byte) 0xC9, (byte) 0x09, (byte) 0x08, (byte) 0xC8, (byte) 0xD8, (byte) 0x18, (byte) 0x19, (byte) 0xD9, (byte) 0x1B, (byte) 0xDB, (byte) 0xDA, (byte) 0x1A, (byte) 0x1E, (byte) 0xDE, (byte) 0xDF, (byte) 0x1F, (byte) 0xDD, (byte) 0x1D, (byte) 0x1C, (byte) 0xDC, (byte) 0x14, (byte) 0xD4, (byte) 0xD5, (byte) 0x15, (byte) 0xD7, (byte) 0x17, (byte) 0x16, (byte) 0xD6, (byte) 0xD2, (byte) 0x12, + (byte) 0x13, (byte) 0xD3, (byte) 0x11, (byte) 0xD1, (byte) 0xD0, (byte) 0x10, (byte) 0xF0, (byte) 0x30, (byte) 0x31, (byte) 0xF1, (byte) 0x33, (byte) 0xF3, (byte) 0xF2, (byte) 0x32, (byte) 0x36, (byte) 0xF6, (byte) 0xF7, (byte) 0x37, (byte) 0xF5, (byte) 0x35, (byte) 0x34, (byte) 0xF4, (byte) 0x3C, (byte) 0xFC, (byte) 0xFD, (byte) 0x3D, (byte) 0xFF, (byte) 0x3F, (byte) 0x3E, (byte) 0xFE, (byte) 0xFA, (byte) 0x3A, (byte) 0x3B, (byte) 0xFB, (byte) 0x39, (byte) 0xF9, (byte) 0xF8, (byte) 0x38, (byte) 0x28, (byte) 0xE8, (byte) 0xE9, (byte) 0x29, (byte) 0xEB, (byte) 0x2B, (byte) 0x2A, (byte) 0xEA, (byte) 0xEE, (byte) 0x2E, (byte) 0x2F, (byte) 0xEF, (byte) 0x2D, (byte) 0xED, (byte) 0xEC, (byte) 0x2C, (byte) 0xE4, (byte) 0x24, (byte) 0x25, (byte) 0xE5, (byte) 0x27, (byte) 0xE7, + (byte) 0xE6, (byte) 0x26, (byte) 0x22, (byte) 0xE2, (byte) 0xE3, (byte) 0x23, (byte) 0xE1, (byte) 0x21, (byte) 0x20, (byte) 0xE0, (byte) 0xA0, (byte) 0x60, (byte) 0x61, (byte) 0xA1, (byte) 0x63, (byte) 0xA3, (byte) 0xA2, (byte) 0x62, (byte) 0x66, (byte) 0xA6, (byte) 0xA7, (byte) 0x67, (byte) 0xA5, (byte) 0x65, (byte) 0x64, (byte) 0xA4, (byte) 0x6C, (byte) 0xAC, (byte) 0xAD, (byte) 0x6D, (byte) 0xAF, (byte) 0x6F, (byte) 0x6E, (byte) 0xAE, (byte) 0xAA, (byte) 0x6A, (byte) 0x6B, (byte) 0xAB, (byte) 0x69, (byte) 0xA9, (byte) 0xA8, (byte) 0x68, (byte) 0x78, (byte) 0xB8, (byte) 0xB9, (byte) 0x79, (byte) 0xBB, (byte) 0x7B, (byte) 0x7A, (byte) 0xBA, (byte) 0xBE, (byte) 0x7E, (byte) 0x7F, (byte) 0xBF, (byte) 0x7D, (byte) 0xBD, (byte) 0xBC, (byte) 0x7C, (byte) 0xB4, (byte) 0x74, + (byte) 0x75, (byte) 0xB5, (byte) 0x77, (byte) 0xB7, (byte) 0xB6, (byte) 0x76, (byte) 0x72, (byte) 0xB2, (byte) 0xB3, (byte) 0x73, (byte) 0xB1, (byte) 0x71, (byte) 0x70, (byte) 0xB0, (byte) 0x50, (byte) 0x90, (byte) 0x91, (byte) 0x51, (byte) 0x93, (byte) 0x53, (byte) 0x52, (byte) 0x92, (byte) 0x96, (byte) 0x56, (byte) 0x57, (byte) 0x97, (byte) 0x55, (byte) 0x95, (byte) 0x94, (byte) 0x54, (byte) 0x9C, (byte) 0x5C, (byte) 0x5D, (byte) 0x9D, (byte) 0x5F, (byte) 0x9F, (byte) 0x9E, (byte) 0x5E, (byte) 0x5A, (byte) 0x9A, (byte) 0x9B, (byte) 0x5B, (byte) 0x99, (byte) 0x59, (byte) 0x58, (byte) 0x98, (byte) 0x88, (byte) 0x48, (byte) 0x49, (byte) 0x89, (byte) 0x4B, (byte) 0x8B, (byte) 0x8A, (byte) 0x4A, (byte) 0x4E, (byte) 0x8E, (byte) 0x8F, (byte) 0x4F, (byte) 0x8D, (byte) 0x4D, + (byte) 0x4C, (byte) 0x8C, (byte) 0x44, (byte) 0x84, (byte) 0x85, (byte) 0x45, (byte) 0x87, (byte) 0x47, (byte) 0x46, (byte) 0x86, (byte) 0x82, (byte) 0x42, (byte) 0x43, (byte) 0x83, (byte) 0x41, (byte) 0x81, (byte) 0x80, (byte) 0x40}; + + /** + * 计算CRC16校验 + * + * @param data 需要计算的数组 + * @return CRC16校验值 + */ + public static int calcCrc16(byte[] data) { + return calcCrc16(data, 0, data.length); + } + + /** + * 计算CRC16校验 + * + * @param data 需要计算的数组 + * @param offset 起始位置 + * @param len 长度 + * @return CRC16校验值 + */ + public static int calcCrc16(byte[] data, int offset, int len) { + return calcCrc16(data, offset, len, 0xffff); + } + + /** + * 计算CRC16校验 + * + * @param data 需要计算的数组 + * @param offset 起始位置 + * @param len 长度 + * @param preval 之前的校验值 + * @return CRC16校验值 + */ + public static int calcCrc16(byte[] data, int offset, int len, int preval) { + int ucCRCHi = (preval & 0xff00) >> 8; + int ucCRCLo = preval & 0x00ff; + int iIndex; + for (int i = 0; i < len; ++i) { + iIndex = (ucCRCLo ^ data[offset + i]) & 0x00ff; + ucCRCLo = ucCRCHi ^ crc16_tab_h[iIndex]; + ucCRCHi = crc16_tab_l[iIndex]; + } + return ((ucCRCHi & 0x00ff) << 8) | (ucCRCLo & 0x00ff) & 0xffff; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/LicenseJPGPair.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/LicenseJPGPair.java new file mode 100644 index 0000000..3b18c84 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/devicectrl/utils/LicenseJPGPair.java @@ -0,0 +1,13 @@ +package com.cowr.local.ssjygl.devicectrl.utils; + +import java.io.File; + +public class LicenseJPGPair { + public String license; + public File file; + + public LicenseJPGPair(String license, File file) { + this.license = license; + this.file = file; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/driver/DriverController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/driver/DriverController.java new file mode 100644 index 0000000..090a2c0 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/driver/DriverController.java @@ -0,0 +1,67 @@ +package com.cowr.local.ssjygl.driver; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Driver; +import com.cowr.ssjygl.driver.DriverPKValidator; +import com.cowr.ssjygl.driver.DriverService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: driver + * Remarks: 司机信息 + * PrimaryKey: id + */ +public class DriverController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(DriverPKValidator.class) + public void checkExistsByPk() { + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 driver 司机信息 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + String phone = get("name"); + Integer trans_co_id = getInt("trans_co_id"); + Integer del = getInt("del"); + renderJson(Result.object(DriverService.me.find(pp, name, phone, trans_co_id, del))); + } + + /** + * 按主键查找单个对象 driver 司机信息 + */ + @Before(DriverPKValidator.class) + public void findByPk() { + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 driver 司机信息 + */ + @Before(DriverPKValidator.class) + public void get() { + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverService.me.findByPk(model)); + } + + /** + * 返回所有 driver 司机信息 + */ + public void list() { + renderJson(Result.object(DriverService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/jobs/SyncJob.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/jobs/SyncJob.java new file mode 100644 index 0000000..787471b --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/jobs/SyncJob.java @@ -0,0 +1,18 @@ +package com.cowr.local.ssjygl.jobs; + +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.jfinal.log.Log; +import org.quartz.Job; +import org.quartz.JobExecutionContext; + +public class SyncJob implements Job { + private static Log log = Log.getLog(SyncJob.class); + @Override + public void execute(JobExecutionContext jobExecutionContext){ + try { + SyncTaskService.me.task(); + }catch (Exception e){ + log.error(e.getMessage(), e); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/AuthInterceptor.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/AuthInterceptor.java new file mode 100644 index 0000000..778bf1b --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/AuthInterceptor.java @@ -0,0 +1,56 @@ +package com.cowr.local.ssjygl.main; + +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Sysuser; +import com.jfinal.aop.Interceptor; +import com.jfinal.aop.Invocation; +import com.jfinal.core.Controller; +import com.jfinal.log.Log; + +public class AuthInterceptor implements Interceptor { + private static Log log = Log.getLog(AuthInterceptor.class); + private String ENV; + + public AuthInterceptor(String ENV) { + this.ENV = ENV; + } + + @Override + public void intercept(Invocation inv) { + try { + if ("dev".equals(this.ENV)) { + inv.invoke(); + } else { + Controller c = inv.getController(); + String token = c.get("token"); + + //避免有提交文件的获取不到 token + if (token == null) { + try { + c.getFile(); + } catch (Exception ignored) { + + } + } + + if (token == null) { + c.renderJson(Result.noauth()); + return; + } + + Sysuser sysuser = SysuserService.me.getSysuserByToken(token); + + if (sysuser == null) { + c.renderJson(Result.noauth()); + return; + } + + inv.invoke(); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + inv.getController().renderJson(Result.failedstr("服务端异常: %s", e.getMessage() )); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/CliCacheData.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/CliCacheData.java new file mode 100644 index 0000000..ce2046a --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/CliCacheData.java @@ -0,0 +1,20 @@ +package com.cowr.local.ssjygl.main; + +import com.cowr.model.Supermarket; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CliCacheData { + public static Supermarket SUP = null; // 当前超市对象 + public static Map> licenseInQueue = new HashMap<>(); //车辆入场识别队列,兼容多个出入口 + public static Map> licenseOutQueue = new HashMap<>(); //车辆出场识别队列,兼容多个出入口 + public static Map> licenseSameQueue = new HashMap<>(); //车辆出场识别队列,同进同出 + public static Map> licenseInHis = new HashMap<>(); //车辆入场识别历史,兼容多个出入口 + + public static Map nowLicenseMap = new HashMap<>(); // 车牌 + public static Map nowWeightMap = new HashMap<>(); // 重量 +} 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 new file mode 100644 index 0000000..85249fc --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Config.java @@ -0,0 +1,383 @@ +package com.cowr.local.ssjygl.main; + +import com.alibaba.druid.filter.stat.StatFilter; +import com.alibaba.druid.wall.WallFilter; +import com.cowr.common.ctrl.HomeController; +import com.cowr.local.ssjygl.authlicense.AuthLicenseController; +import com.cowr.local.ssjygl.authlicense.AuthLicenseSyncService; +import com.cowr.local.ssjygl.blacklist.BlacklistController; +import com.cowr.local.ssjygl.cache.CacheController; +import com.cowr.local.ssjygl.customer.CustomerController; +import com.cowr.local.ssjygl.customer.contact.CustomerContactController; +import com.cowr.local.ssjygl.customer.receiver.CustomerReceiverController; +import com.cowr.local.ssjygl.devicectrl.common.Const; +import com.cowr.local.ssjygl.devicectrl.common.DeviceThread; +import com.cowr.local.ssjygl.devicectrl.device.CameraController; +import com.cowr.local.ssjygl.driver.DriverController; +import com.cowr.local.ssjygl.netty.NettyClient; +import com.cowr.local.ssjygl.netty.SocketIOService; +import com.cowr.local.ssjygl.order.ordercluster.OrderclusterController; +import com.cowr.local.ssjygl.order.orderpurchase.OrderPurchaseController; +import com.cowr.local.ssjygl.order.ordersale.OrderSaleController; +import com.cowr.local.ssjygl.order.ordertemp.OrderTempController; +import com.cowr.local.ssjygl.order.ordertransfer.OrderTransferController; +import com.cowr.local.ssjygl.order.ordertrash.OrderTrashController; +import com.cowr.local.ssjygl.prepay.prepaydetail.PrepayDetailController; +import com.cowr.local.ssjygl.prepay.prepaytruck.PrepayTruckController; +import com.cowr.local.ssjygl.prepay.refunddetail.RefundDetailController; +import com.cowr.local.ssjygl.product.ProductController; +import com.cowr.local.ssjygl.purchase.PurchaseController; +import com.cowr.local.ssjygl.sandfarm.SandfarmController; +import com.cowr.local.ssjygl.supermarket.SupermarketController; +import com.cowr.local.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistanceController; +import com.cowr.local.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistanceController; +import com.cowr.local.ssjygl.supermarket.stock.StockController; +import com.cowr.local.ssjygl.supermarket.stock.StockSyncService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.common.plugin.QuartzPlugin; +import com.cowr.local.ssjygl.transport.TransportController; +import com.cowr.local.ssjygl.transport.TransportQueryController; +import com.cowr.local.ssjygl.transportcompany.TransportCompanyController; +import com.cowr.local.ssjygl.truck.TruckController; +import com.cowr.model.Supermarket; +import com.cowr.ssjygl.CacheData; +import com.cowr.ssjygl.cctv.CctvController; +import com.cowr.ssjygl.prepay.PrepayController; +import com.cowr.ssjygl.stat.purchase.OrderPurchaseStatController; +import com.cowr.ssjygl.stat.sale.OrderStatController; +import com.cowr.ssjygl.stat.transfer.OrderTransferStatController; +import com.cowr.local.ssjygl.system.sysuser.SysuserController; +import com.cowr.ssjygl.transportcompany.TransportCompanyService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.config.*; +import com.jfinal.json.FastJsonFactory; +import com.jfinal.kit.PathKit; +import com.jfinal.kit.Prop; +import com.jfinal.kit.PropKit; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +import com.jfinal.plugin.activerecord.SqlReporter; +import com.jfinal.plugin.activerecord.dialect.MysqlDialect; +import com.jfinal.plugin.druid.DruidPlugin; +import com.jfinal.plugin.redis.RedisPlugin; +import com.jfinal.template.Engine; +import com.cowr.common.Interceptor.ReporterInterceptor; +import com.cowr.common.handler.GlobalHandler; +import com.cowr.common.view.JsonRenderFactory; +import com.cowr.model._MappingKit; + +import java.io.File; +import java.sql.Connection; + +public class Config extends JFinalConfig { + private static Log log = Log.getLog(Config.class); + public static String ENV = "dev"; + public static Prop configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); + public static Prop dbprop = PropKit.use(ENV + "/db.properties", "UTF-8"); + private WallFilter wallFilter; + public static NettyClient nettyClient = null; + public static DeviceThread deviceThread = new DeviceThread(); + public static SocketIOService socketio = null; + private static boolean client_run = true; + + public static String getRootPath() { + return PathKit.getWebRootPath() + .substring(0, PathKit.getWebRootPath().indexOf(File.separator + "ssjygl-xsx-local")) + + File.separator + "ssjygl-local"; + } + + private class ClientThread extends Thread { + @Override + public void run() { + try { + while (client_run) { + nettyClient = new NettyClient( + configprop.get("socketserver.host"), + configprop.getInt("socketserver.port"), + configprop.getInt("current.supermarket_id") + ); + nettyClient.start(); + + try { + Thread.sleep(1000); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } + + private void initPropConfig() { + dbprop = PropKit.use(ENV + "/db.properties"); + configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); + + CacheData.print_vendor = configprop.get("print.vendor"); + CacheData.print_vendorTaxId = configprop.get("print.vendorTaxId"); + + try { + String start = configprop.get("start.trans.distance"); + + if (StrKit.isBlank(start)) { + log.error("读取运费起步运距错误"); + return; + } + CacheData.start_trans_distance = Double.valueOf(start); + + String weight_distinguish_str = Config.configprop.get("weight.distinguish"); + + if (StrKit.notBlank(weight_distinguish_str)) { + double weight_distinguish = Double.parseDouble(weight_distinguish_str); + + if (weight_distinguish > 0 && weight_distinguish < 1) { + CacheData.weight_distinguish = weight_distinguish; + } + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + @Override + public void configConstant(Constants me) { + initPropConfig(); + + me.setJsonFactory(FastJsonFactory.me()); + me.setDevMode(false); // 在 windows 下使用自定义的 ActionReporter, 这里就不需要 true 了 + me.setRenderFactory(new JsonRenderFactory()); + me.setMaxPostSize(1024 * 1024 * 100); // 100 M + } + + @Override + public void configRoute(Routes me) { + me.add("/", HomeController.class); + me.add("/cache", CacheController.class); + me.add("/camera", CameraController.class); + me.add("/supcctv", CctvController.class); + + // -- 交行支付相关(接收回调通知) +// me.add("/bocomm", BocommController.class); + + // -- 权限系统 + me.add("/sysuser", SysuserController.class); + + // -- 基础信息 + me.add("/sandfarm", SandfarmController.class); + me.add("/supermarket", SupermarketController.class); + me.add("/supermarket/ssd", SupermarketSandfarmDistanceController.class); + me.add("/supermarket/srd", SupermarketReceiverDistanceController.class); + me.add("/purchase", PurchaseController.class); + me.add("/product", ProductController.class); + me.add("/stock", StockController.class); + + // -- 物流公司相关 + me.add("/transCo", TransportCompanyController.class); + me.add("/truck", TruckController.class); + me.add("/driver", DriverController.class); + me.add("/blacklist", BlacklistController.class); + + // -- 客户相关 + me.add("/customer", CustomerController.class); + me.add("/customer/contact", CustomerContactController.class); + me.add("/customer/receiver", CustomerReceiverController.class); + + // -- 预付费 + me.add("/prepay", PrepayController.class); + me.add("/prepaydetail", PrepayDetailController.class); + me.add("/prepaytruck", PrepayTruckController.class); + me.add("/refunddetail", RefundDetailController.class); + + // -- 出入场控制 + me.add("/transport", TransportController.class); + me.add("/transport/query", TransportQueryController.class); + me.add("/transport/authlic", AuthLicenseController.class); + + // -- 订单相关 + me.add("/order/ordercluster", OrderclusterController.class); + me.add("/order/sale", OrderSaleController.class); + me.add("/order/temp", OrderTempController.class); + me.add("/order/transfer", OrderTransferController.class); + me.add("/order/trash", OrderTrashController.class); + me.add("/order/purchase", OrderPurchaseController.class); + + // -- 统计 + me.add("/stat/sale", OrderStatController.class); + me.add("/stat/transfer", OrderTransferStatController.class); + me.add("/stat/purchase", OrderPurchaseStatController.class); + } + + @Override + public void configEngine(Engine me) { + + } + + @Override + public void configPlugin(Plugins me) { + boolean devMode = configprop.getBoolean("devMode", false); + boolean isprod = "prod".equals(ENV); + + SqlReporter.setLog(devMode); + + { + DruidPlugin druidPlugin = new DruidPlugin(dbprop.get("jdbcUrl"), dbprop.get("user"), dbprop.get("password").trim()); + wallFilter = new WallFilter(); // 加强数据库安全 + wallFilter.setDbType("mysql"); + druidPlugin.addFilter(wallFilter); + druidPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据 + me.add(druidPlugin); + + ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); + arp.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED); + _MappingKit.mapping(arp); + arp.setDialect(new MysqlDialect()); + me.add(arp); + arp.setShowSql("dev".equals(ENV)); + } + + me.add(new QuartzPlugin()); + + if (isprod) { + RedisPlugin redis = new RedisPlugin( + com.cowr.common.Const.REDIS_CACHENAME, + dbprop.get("redis.ip"), + dbprop.getInt("redis.port"), + 0 + ); + + me.add(redis); + } else { + me.add(new RedisPlugin( + com.cowr.common.Const.REDIS_CACHENAME, + dbprop.get("redis.ip"), + dbprop.getInt("redis.port"), + 0, + dbprop.get("redis.pwd"), + dbprop.getInt("redis.db") + )); + } + } + + @Override + public void configInterceptor(Interceptors me) { + me.add(new AuthInterceptor(ENV)); + + boolean devMode = configprop.getBoolean("devMode", false); + if (devMode) { + me.add(new ReporterInterceptor()); + } + } + + @Override + public void configHandler(Handlers me) { + // 让 druid 允许在 sql 中使用 union + // https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter + wallFilter.getConfig().setSelectUnionCheck(false); + me.add(new GlobalHandler()); + } + + public void onStart() { + try { + File file = new File(getRootPath() + File.separator + Const.LicenseImgTmpFolder); + log.debug(Const.LicenseImgTmpFolder + ":" + file.getAbsolutePath()); + if (!file.exists()) { + file.mkdir(); + file.setWritable(true, false); + } + + file = new File(getRootPath() + File.separator + Const.PringExcelTmpFolder); + log.debug(Const.PringExcelTmpFolder + ":" + file.getAbsolutePath()); + if (!file.exists()) { + file.mkdir(); + file.setWritable(true, false); + } + + CliCacheData.SUP = Supermarket.dao.findById(configprop.getInt("current.supermarket_id")); + + if (CliCacheData.SUP == null) { + log.error("没有获取到有效的超市信息,检查配置是否正确"); + + try { + Thread.sleep(10000); + } catch (Exception e) { + + } + + System.exit(0); + } + + StockSyncService.me.initSupermarketStock(); + AuthLicenseSyncService.me.init(); + TransportCompanyService.me.initTransCoPriceModulus(); // 初始化物流公司价格系数配置 + TransPriceService.me.initTransPriceConfigSale(); // 初始化销售订单运输价格配置 + TransPriceService.me.initTransPriceConfigTransfer(); // 初始出转运订单运输价格配置 + TransPriceService.me.initTransPriceConfigTrash(); // 初始出废料订单运输价格配置 + + CacheData.service_enable = configprop.getBoolean("socketserver.enable", false); + + if (SyncTaskService.me.isEnable()) { + new ClientThread().start(); + } + + socketio = new SocketIOService(configprop.getInt("socketio.port")); + socketio.start(); + +// BocommXMLKit.me.init(); // 初始化银行 sdk + + // 最后启动 deviceThread + if ("prod".equals(ENV)) { + deviceThread.start(); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + public void onStop() { + client_run = false; + + if (nettyClient != null) { + nettyClient.stop(); + } + + if (deviceThread != null) { + System.out.println("关闭 deviceThread"); + deviceThread.close(); + deviceThread.interrupt(); + } + + if (socketio != null) { + socketio.stop(); + } + } + + /** + * 判断当前是 开发 环境,还是 生产 环境 + * 根据不同的环境变量读取不同数据库连接 + * + * @return + */ + public static boolean isProd() { + String OS = System.getProperty("os.name").toLowerCase(); + // 简单粗暴的判断,在 linux 环境下运行时,为生成环境 + if (OS.contains("linux")) { + // 根据 Linux 上的运行目录,判断当前连接那个数据库 + // 这边将 生产 环境运行目录写死,只有在这个目录下运行时,才算 生产 环境 + String path = PathKit.getWebRootPath(); + log.debug("WebRootPath:", path); + String linux_dev_dir = "/home/admin123456/ssjygl_hzq/ssjygl-local-release"; + + if (linux_dev_dir.equals(path)) { + ENV = "prod"; + + return true; + } else { + return false; + } + } else { + return false; + } + } +} 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 new file mode 100644 index 0000000..7276ada --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/main/Main.java @@ -0,0 +1,52 @@ +package com.cowr.local.ssjygl.main; + +import com.jfinal.kit.PathKit; +import com.jfinal.log.Log; +import com.jfinal.server.undertow.UndertowServer; + +import java.lang.management.ManagementFactory; + +public class Main { + private static Log log = Log.getLog(Main.class); + + public static void main(String[] args) { + String name = ManagementFactory.getRuntimeMXBean().getName(); + String pid = name.split("@")[0]; + + /** + * 启动必须初始化表 + * supermarket + * product + * supermarket_product + * sysuser + */ + + log.info("===================================================="); + log.info("========= 启动本地服务 ==============="); + log.info("========= PID: %s ===============", pid); + + boolean isprod = Config.isProd(); + String path = PathKit.getWebRootPath(); + + if (isprod) { + log.info("===================================================="); + log.info("========= production environment ================"); + log.info("===================================================="); + log.info("Running directory: " + path); + + // 相关配置见 undertow.txt + UndertowServer.create(Config.class, Config.ENV + "/undertow.txt").start(); + } else { + log.info("===================================================="); + log.info("========= development environment ==============="); + log.info("===================================================="); + log.info("Running directory: " + path); + + // 相关配置见 undertow.txt + UndertowServer + .create(Config.class, Config.ENV + "/undertow.txt") + .addHotSwapClassPrefix("com.cowr.") + .start(); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/AbstractClient.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/AbstractClient.java new file mode 100644 index 0000000..6b45351 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/AbstractClient.java @@ -0,0 +1,96 @@ +package com.cowr.local.ssjygl.netty; + +import com.jfinal.log.Log; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; + +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +public abstract class AbstractClient implements EndPoint { + private static Log log = Log.getLog(AbstractClient.class); + private String hostName; + private int port; + private int connectionTimeout; + + protected final CountDownLatch countDownLatch = new CountDownLatch(1); + protected String respMsg; + + public void send(Object message) { + try { + doOpen(); + doConnect(); + write(message); + } catch (Throwable e) { + log.error(e.getMessage(), e); + } + } + + public int getConnectionTimeout() { + return connectionTimeout; + } + + public String receive() { + try { + boolean b = countDownLatch.await(getConnectionTimeout(), TimeUnit.MILLISECONDS); + if (!b) { + log.error("Timeout(" + getConnectionTimeout() + "ms) when receiving response message"); + } + return respMsg; + } catch (InterruptedException e) { + log.error(e.getMessage(), e); + + return null; + } + } + + private void write(Object message) { + Channel channel = getChannel(); + if (null != channel) { + ChannelFuture f = channel.writeAndFlush(byteBufferFrom(message)).syncUninterruptibly(); + if (!f.isSuccess()) { + log.error("Failed to send message to " + getRemoteAddress() + f.cause().getMessage()); + } + } + } + + private ByteBuf byteBufferFrom(Object message) { + return message instanceof String ? Unpooled.copiedBuffer((String) message, StandardCharsets.UTF_8) : Unpooled.copiedBuffer((byte[]) message); + } + + @Override + public InetSocketAddress getRemoteAddress() { + return new InetSocketAddress(hostName, port); + } + + @Override + public InetSocketAddress getLocalAddress() { + throw new NotImplementedException(); + } + + /** + * Open client. + * + * @throws Throwable + */ + protected abstract void doOpen() throws Throwable; + + /** + * Connect to server. + * + * @throws Throwable + */ + protected abstract void doConnect() throws Throwable; + + /** + * Get the connected channel. + * + * @return channel + */ + protected abstract Channel getChannel(); +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/EndPoint.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/EndPoint.java new file mode 100644 index 0000000..7bb7d08 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/EndPoint.java @@ -0,0 +1,17 @@ +package com.cowr.local.ssjygl.netty; + +import java.net.InetSocketAddress; + +public interface EndPoint { + /** + * 获取本地服务地址 + * @return + */ + InetSocketAddress getLocalAddress() throws Exception; + + /** + * 获取远端服务地址 + * @return + */ + InetSocketAddress getRemoteAddress(); +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java new file mode 100644 index 0000000..f87110d --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/NettyClient.java @@ -0,0 +1,250 @@ +package com.cowr.local.ssjygl.netty; + +import com.alibaba.fastjson.JSONObject; +import com.cowr.common.enums.Enums; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.jfinal.log.Log; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.LineBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.handler.timeout.*; +import io.netty.util.CharsetUtil; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class NettyClient { + private static final ThreadLocal sdf = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + } + }; + + private static Log log = Log.getLog(NettyClient.class); + private String host; + private int port; + private int supermarket_id; // 当前部署本地程序的销售点id + private Bootstrap nettyBootstrap; + private static Channel channel; + private static boolean debuglog = false; + + public NettyClient(String host, int port, int supermarket_id) { + this.host = host; + this.port = port; + this.supermarket_id = supermarket_id; + } + + public void showDebugLog() { + debuglog = true; + } + + public void hideDebugLog() { + debuglog = false; + } + + /** + * 控制台输出,调试用 + * + * @param msg + */ + private static void printlog(String msg) { + if (debuglog) { + System.out.println(sdf.get().format(new Date()) + " " + msg); + } + } + + public void start() { + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + if (nettyBootstrap == null) { + nettyBootstrap = new Bootstrap(); + nettyBootstrap.group(workerGroup); + nettyBootstrap.channel(NioSocketChannel.class); + nettyBootstrap.option(ChannelOption.SO_KEEPALIVE, true); + nettyBootstrap.handler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ch.pipeline().addLast( + new WriteTimeoutHandler(15), + new ReadTimeoutHandler(15), + new IdleStateHandler(5, 5, 5), // 处理心跳包 + new StringEncoder(CharsetUtil.UTF_8), + new LineBasedFrameDecoder(4096), // 处理粘包问题 + new StringDecoder(CharsetUtil.UTF_8), + new MsgHandler(supermarket_id) + ); + } + }); + } + + ChannelFuture channelFuture; + synchronized (nettyBootstrap) { + channelFuture = nettyBootstrap.connect(host, port); + } + + channelFuture.sync(); + Channel channel = channelFuture.channel(); + channel.closeFuture().sync(); + } catch (Exception e) { +// log.error(e.getMessage(), e); + } finally { + workerGroup.shutdownGracefully(); + } + } + + public void stop() { + log.debug("停止 socket 服务"); + try { + if (channel != null) { + channel.parent().close(); + channel.close(); + } + + if (nettyBootstrap != null) { + nettyBootstrap = null; + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + public boolean sendMsg(String msg) { + if (channel != null) { + channel.write(msg); + channel.writeAndFlush("\n"); + return true; + } else { + log.debug("未连接到服务端"); + return false; + } + } + + private static class MsgHandler extends SimpleChannelInboundHandler { + private int supermarket_id; + + MsgHandler(int supermarket_id) { + this.supermarket_id = supermarket_id; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + if (!validateMsg(msg)) { + sendMsg(ctx, deny().toJSONString()); + } + + JSONObject json = JSONObject.parseObject(msg); + String target = json.getString("target"); + + // 心跳回复 + if (Enums.MsgTarget.HEARTBEATREPLY.name().equals(target)) { + return; + } + + if (Enums.MsgTarget.LOGIN.name().equals(target)) { + log.debug("注册成功,supermarket_id:" + supermarket_id); + } else if (Enums.MsgTarget.SYNCTASK.name().equals(target)) { + JSONObject data = json.getJSONObject("data"); + boolean ret = SyncTaskService.me.recv(data); + + // 接收成功后,返回id + if (ret) { + sendMsg(ctx, new JSONObject() + .fluentPut("target", Enums.MsgTarget.SYNCRECV) + .fluentPut("id", data.get("id")) + .toJSONString()); + } + } else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) { + SyncTaskService.me.syncComplete(json.getString("id")); + } else { + System.out.println(json); + } + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.debug("服务端连接成功"); + super.channelActive(ctx); + + channel = ctx.channel(); + + JSONObject json = new JSONObject(); + json.fluentPut("target", Enums.MsgTarget.LOGIN.name()).fluentPut("supermarket_id", supermarket_id); + sendMsg(ctx, json.toJSONString()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + log.debug("服务器已断开或无法连接,尝试重连。。。"); + super.channelUnregistered(ctx); + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + if (evt instanceof IdleStateEvent) { + IdleState state = ((IdleStateEvent) evt).state(); + if (state == IdleState.WRITER_IDLE) { + // write heartbeat to server + JSONObject json = new JSONObject(); + json.put("target", Enums.MsgTarget.HEARTBEAT); + + ctx.channel().write(json.toJSONString()); + ctx.channel().writeAndFlush("\n"); + + printlog("向服务器发送心跳包"); + } + } else { + super.userEventTriggered(ctx, evt); + } + } + + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (!(cause instanceof IOException) && !(cause instanceof Error)) { + cause.printStackTrace(); + ctx.close(); + } + } + + void sendMsg(ChannelHandlerContext ctx, String msg) { + ctx.channel().write(msg); + ctx.channel().writeAndFlush("\n"); + } + + JSONObject deny() { + return new JSONObject().fluentPut("target", "deny"); + } + + boolean validateMsg(String msg) { + try { + JSONObject obj = JSONObject.parseObject(msg); + + if (obj == null) { + return false; + } + + return obj.containsKey("target"); + } catch (Exception e) { + return false; + } + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/SocketIOService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/SocketIOService.java new file mode 100644 index 0000000..60762af --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/netty/SocketIOService.java @@ -0,0 +1,136 @@ +package com.cowr.local.ssjygl.netty; + +import com.alibaba.fastjson.JSONObject; +import com.corundumstudio.socketio.*; +import com.corundumstudio.socketio.listener.ConnectListener; +import com.corundumstudio.socketio.listener.DataListener; +import com.corundumstudio.socketio.listener.DisconnectListener; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Record; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * 基于 netty 的 socketio 服务 + * 和 web 端 socketio 建立通信 + * web 端的 socketio 可以兼容常见的浏览器 + * TODO:怎么区分多个超市的消息推送 + */ +public class SocketIOService { + private static Log log = Log.getLog(SocketIOService.class); + private int port; + private SocketIOServer server; + + public SocketIOService(int port) { + this.port = port; + } + + /** + * 刷新硬件数据 + * @param record + */ + public void pubRefreshReal(Record record){ + pub("refresh_real", record); + } + + /** + * 刷新已入场车辆 + * @param record + */ + public void pubRefreshInSup(Record record){ + pub("refresh_in_sup", record); + } + + /** + * 其他消息 + * @param record + */ + public void pubMessage(Record record){ + pub("message", record); + } + /** + * 银行结算完成 + * @param record + */ + public void pubBankPayComplete(Record record){ + pub("bank_pay_complete", record); + } + + public void pub(String channel, Record record) { + pub(channel, new JSONObject().fluentPutAll(record.getColumns())); + } + + public void pub(String channel, JSONObject params) { + if (server != null) { + log.debug(channel); + server.getBroadcastOperations().sendEvent(channel, params); + } + } + + public boolean start() { + Configuration config = new Configuration(); + config.setPort(port); + + server = new SocketIOServer(config); + + server.addConnectListener(new ConnectListener() { + @Override + public void onConnect(SocketIOClient client) { + log.debug("客户端连接:%s", client.getRemoteAddress()); + } + }); + + server.addDisconnectListener(new DisconnectListener(){ + @Override + public void onDisconnect(SocketIOClient client) { + log.debug("客户端断开连接:%s", client.getRemoteAddress()); + } + }); + + server.addEventListener("refresh_real", JSONObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, JSONObject data, AckRequest ackRequest) { + server.getBroadcastOperations().sendEvent("refresh_real", data); + } + }); + + server.addEventListener("refresh_in_sup", JSONObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, JSONObject data, AckRequest ackRequest) { + server.getBroadcastOperations().sendEvent("refresh_in_sup", data); + } + }); + + server.addEventListener("message", JSONObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, JSONObject data, AckRequest ackRequest) { + server.getBroadcastOperations().sendEvent("message", data); + } + }); + + server.start(); + + log.debug("启动 Socket.IO, 服务端口: %s", this.port); + + return true; + } + + public boolean stop() { + if (server != null) { + Iterator iterator = server.getAllClients().iterator(); + log.debug("开始销毁 socket.io client:" + server.getAllClients().size()); + + while (iterator.hasNext()){ + SocketIOClient client = iterator.next(); + client.disconnect(); + log.debug("销毁 socket.io client:" + client); + } + + server.stop(); + } + + return true; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/OrderService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/OrderService.java new file mode 100644 index 0000000..8def351 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/OrderService.java @@ -0,0 +1,489 @@ +package com.cowr.local.ssjygl.order; + +import com.cowr.common.base.BaseModel; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.utils.ChineseNumberUtil; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.actioncmdlog.ActionCmdLogService; +import com.cowr.local.ssjygl.devicectrl.common.Const; +import com.cowr.local.ssjygl.devicectrl.printer.ExcelHelper; +import com.cowr.local.ssjygl.main.Config; +import com.cowr.local.ssjygl.transport.TransportDeviceService; +import com.cowr.model.*; +import com.cowr.ssjygl.CacheData; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.kit.PathKit; +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.Workbook; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class OrderService { + private static Log log = Log.getLog(OrderService.class); + public static OrderService me = new OrderService(); + private static final ThreadLocal sdf = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + + /** + * 订单结算完成,打印票据 + * + * @param ret + * @param printdata + * @param transport + * @param printerId + * @return + */ + public Result orderPayComplete(boolean ret, Record printdata, Transport transport, String printerId) { + Record out = new Record(); + out.set("pay", ret); // 支付结果 + + if (ret) { + printdata.set("first_weight", transport.getFirstWeight()); + printdata.set("second_weight", transport.getSecondWeight()); + + try { + Config.deviceThread.print(printerId, getPrintFile(printdata)); + out.set("print", true); + } catch (Exception e) { + out.set("print", "打印指令发送失败"); + log.error(e.getMessage(), e); + } + + try { + if (transport.getTruckLicense().equals(Config.deviceThread.getCtrlCurrentLicense(transport.getOutWhich()))) { + Config.deviceThread.cmdRodUp(Enums.RowEnum.BACK.getId(), transport.getOutWhich()); + out.set("rod", true); + } else { + // 银行通知支付完成,对应的车辆已经通过其他方式出场了 + log.debug("不是当前出场的车牌【%s】,不抬杆", transport.getTruckLicense()); + out.set("rod", false); + } + } catch (Exception e) { + out.set("rod", "抬闸指令发送失败"); + log.error(e.getMessage(), e); + } + + Config.socketio.pubRefreshInSup(TransportDeviceService.me.real()); + } + + return Result.success(out); + } + + public Map getPrintModel(Record order) { + if (order == null) { + log.debug("订单号错误"); + return null; + } + + Map out = new HashMap<>(); + + String sn = order.getStr("sn"); + BigDecimal first_weight = order.getBigDecimal("first_weight"); + BigDecimal second_weight = order.getBigDecimal("second_weight"); + BigDecimal min = new BigDecimal(0.001); + int sntype = Integer.parseInt(sn.substring(10, 12)); + + // 验证重量 + if (first_weight == null + || second_weight == null + || first_weight.compareTo(min) < 0 + || second_weight.compareTo(min) < 0 + ) { + log.error("重量数据有误,第一次称重:%.4f,第二次称重:%.4f", first_weight, second_weight); + + return null; + } + + + double goodsNetWeight = Math.abs(order.getDouble("weight")); + + String goodsTareWeight = ""; + String goodsGrossWeight = ""; + String clientName = ""; + String clientTaxId = ""; + String clientContact = ""; + String clientBankInfo = ""; + String origin = ""; // 运输起点 + String dest = ""; // 运输终点 + String vendor = ""; // 销售方名称 + String vendorTaxId = ""; // 销售方纳税人识别号 + String remark = ""; + + String paid = "---"; // 总价 + String paidUp = "------"; // 总价汉字大写 + String priceTrans = "---"; // 运输单价,车辆载重对应的起步价 + String priceGoods = "---"; // 商品单价 + String transDistance = "---"; // 运输距离 + String priceTransTotal = "---"; // 运输总价 + String priceTransTotalUpper = "---"; // 运输总价大写 + + + if (sntype == OrderTypeEnum.SALE.getTypeid()) { + goodsTareWeight = String.format("%.2f", first_weight); // 皮重 + goodsGrossWeight = String.format("%.2f", second_weight); // 毛重 + + clientName = StrUtil.getRecordStr(order, "customer_texpayer_name"); + + if (StrKit.isBlank(clientName)) { + clientName = StrUtil.getRecordStr(order, "customer_name"); + } + + clientTaxId = StrUtil.getRecordStr(order, "customer_texpayer_num"); + clientContact = StrUtil.getRecordStr(order, "customer_address") + " " + StrUtil.getRecordStr(order, "customer_phone"); + clientBankInfo = StrUtil.getRecordStr(order, "customer_bank_name") + " " + StrUtil.getRecordStr(order, "customer_bank_account"); + + Supermarket supermarket = Supermarket.dao.findById(order.get("supermarket_id")); + + if (supermarket == null) { + log.error("获取超市信息失败 %s", order.getInt("supermarket_id")); + return null; + } + + origin = supermarket.getName(); // 运输起点 + dest = clientName; // 运输终点 + + vendor = CacheData.print_vendor; // 销售方名称 + vendorTaxId = CacheData.print_vendorTaxId; // 销售方纳税人识别号 + remark = "销售订单:" + sn; + + if (order.get("total_price") != null) { + paid = String.format("%.2f", order.getBigDecimal("total_price")); // 总价 + paidUp = ChineseNumberUtil.getChineseNumber(order.getBigDecimal("total_price").doubleValue()); // 总价汉字大写 + } else { + paid = ""; // 总价 + paidUp = ""; // 总价汉字大写 + } + + // 运输单价,车辆载重对应的起步价 + priceTrans = TransPriceService.me.getOrderStartTransPrice(order.getInt("trans_co_id"), goodsNetWeight) + ""; + + priceGoods = StrUtil.getRecordStr(order, "unit_price"); // 商品单价 + transDistance = StrUtil.getRecordStr(order, "trans_distance"); // 运输距离 + priceTransTotal = StrUtil.getRecordStr(order, "trans_price"); // 运输总价 + + if (order.get("trans_price") != null) { + priceTransTotalUpper = ChineseNumberUtil.getChineseNumber(order.getBigDecimal("trans_price").doubleValue()); + } else { + priceTransTotalUpper = ""; // 运输总价大写 + } + } else if (sntype == OrderTypeEnum.TRANSFER.getTypeid()) { + goodsTareWeight = String.format("%.2f", second_weight); // 皮重 + goodsGrossWeight = String.format("%.2f", first_weight); // 毛重 + + Sandfarm sandfarm = Sandfarm.dao.findById(order.get("sandfarm_id")); + + if (sandfarm == null) { + log.error("获取砂场信息失败 %s", order.getInt("sandfarm_id")); + return null; + } + + Supermarket supermarket = Supermarket.dao.findById(order.get("supermarket_id")); + + if (supermarket == null) { + log.error("获取超市信息失败 %s", order.getInt("supermarket_id")); + return null; + } + + origin = sandfarm.getName(); // 运输起点 + dest = supermarket.getName(); // 运输终点 + + remark = "转运订单:" + sn; + + if(order.get("source_weight") != null ){ + remark += String.format("\n底单重量:%.2f", order.getBigDecimal("source_weight")); + } + + // 运输单价,车辆载重对应的起步价 + priceTrans = TransPriceService.me.getOrderStartTransPrice(order.getInt("trans_co_id"), goodsNetWeight) + ""; + + priceGoods = StrUtil.getRecordStr(order, "unit_price"); // 商品单价 + transDistance = StrUtil.getRecordStr(order, "trans_distance"); // 运输距离 + priceTransTotal = StrUtil.getRecordStr(order, "trans_price"); // 运输总价 + + if (order.get("trans_price") != null) { + priceTransTotalUpper = ChineseNumberUtil.getChineseNumber(order.getBigDecimal("trans_price").doubleValue()); + } else { + priceTransTotalUpper = ""; // 运输总价大写 + } + } else if (sntype == OrderTypeEnum.TEMP.getTypeid()) { + goodsTareWeight = String.format("%.2f", first_weight); // 皮重 + goodsGrossWeight = String.format("%.2f", second_weight); // 毛重 + + clientName = StrUtil.getRecordStr(order, "customer_texpayer_name"); + + if (StrKit.isBlank(clientName)) { + clientName = StrUtil.getRecordStr(order, "customer_name"); + } + + clientTaxId = StrUtil.getRecordStr(order, "customer_texpayer_num"); + clientContact = StrUtil.getRecordStr(order, "customer_address") + " " + StrUtil.getRecordStr(order, "customer_phone"); + clientBankInfo = StrUtil.getRecordStr(order, "customer_bank_name") + " " + StrUtil.getRecordStr(order, "customer_bank_account"); + + Supermarket supermarket = Supermarket.dao.findById(order.get("supermarket_id")); + + if (supermarket == null) { + log.error("获取超市信息失败 %s", order.getInt("supermarket_id")); + return null; + } + + origin = supermarket.getName(); // 运输起点 + dest = clientName; // 运输终点 + + vendor = CacheData.print_vendor; // 销售方名称 + vendorTaxId = CacheData.print_vendorTaxId; // 销售方纳税人识别号 + + if(order.get("old_sn") != null){ + remark = "外销订单:" + StrUtil.getRecordStr(order, "old_sn"); + }else{ + remark = "外销订单:" + StrUtil.getRecordStr(order, "sn"); + } + + if (order.get("total_price") != null) { + paid = String.format("%.2f", order.getBigDecimal("total_price")); // 总价 + paidUp = ChineseNumberUtil.getChineseNumber(order.getBigDecimal("total_price").doubleValue()); // 总价汉字大写 + } else { + paid = ""; // 总价 + paidUp = ""; // 总价汉字大写 + } + + priceGoods = StrUtil.getRecordStr(order, "unit_price"); // 商品单价 + } else if (sntype == OrderTypeEnum.TRASH.getTypeid()) { + goodsTareWeight = String.format("%.2f", second_weight); // 皮重 + goodsGrossWeight = String.format("%.2f", first_weight); // 毛重 + + Supermarket supermarket = Supermarket.dao.findById(order.get("supermarket_id")); + + if (supermarket == null) { + log.error("获取超市信息失败 %s", order.getInt("supermarket_id")); + return null; + } + + origin = supermarket.getName(); // 运输起点 + + remark = "废料订单:" + sn; + + } else if (sntype == OrderTypeEnum.PURCHASE.getTypeid()) { + goodsTareWeight = String.format("%.2f", second_weight); // 皮重 + goodsGrossWeight = String.format("%.2f", first_weight); // 毛重 + + Purchase purchase = Purchase.dao.findById(order.get("purchase_id")); + + if (purchase == null) { + log.error("获取采购点信息失败 %s", order.getInt("purchase_id")); + return null; + } + + Supermarket supermarket = Supermarket.dao.findById(order.get("supermarket_id")); + + if (supermarket == null) { + log.error("获取超市信息失败 %s", order.getInt("supermarket_id")); + return null; + } + + origin = purchase.getName(); // 运输起点 + dest = supermarket.getName(); // 运输终点 + + if(order.get("old_sn") != null){ + remark = "采购订单:" + StrUtil.getRecordStr(order, "old_sn"); + }else{ + remark = "采购订单:" + StrUtil.getRecordStr(order, "sn"); + } + + if(order.get("source_weight") != null ){ + remark += String.format("\n底单重量:%.2f", order.getBigDecimal("source_weight")); + } + + clientName = CacheData.print_vendor; + clientTaxId = CacheData.print_vendorTaxId; + } + + out.put("goodsTareWeight", goodsTareWeight); + out.put("goodsGrossWeight", goodsGrossWeight); + out.put("qrcode", ""); + out.put("serial", sn); + out.put("datetimePrint", sdf.get().format(new Date())); + out.put("clientName", clientName); + out.put("clientTaxId", clientTaxId); + out.put("clientContact", clientContact); + out.put("clientBankInfo", clientBankInfo); + + out.put("haulerName", StrUtil.getRecordStr(order, "trans_co_name") + " " + StrUtil.getRecordStr(order, "truck_license")); + out.put("haulerCo", StrUtil.getRecordStr(order, "trans_co_name")); + out.put("haulerTaxId", StrUtil.getRecordStr(order, "trans_co_texpayer_num")); + out.put("haulerContact", StrUtil.getRecordStr(order, "trans_co_address") + " " + StrUtil.getRecordStr(order, "trans_co_phone")); + out.put("haulerBankInfo", StrUtil.getRecordStr(order, "trans_co_bank_name") + " " + StrUtil.getRecordStr(order, "trans_co_bank_account")); + + out.put("origin", origin); + out.put("dest", dest); + out.put("goodsName", StrUtil.getRecordStr(order, "product_name")); + out.put("goodsNetWeight", String.format("%.2f", goodsNetWeight)); + out.put("transDistance", transDistance); + out.put("priceGoods", priceGoods); + out.put("priceGoodsTotal", paid); // ? 重量总价? + out.put("priceGoodsTotalUpper", paidUp); // ? 重量总价? + out.put("priceTrans", priceTrans); // 起步载重对应的单价 + out.put("priceTransTotal", priceTransTotal); + out.put("priceTransTotalUpper", priceTransTotalUpper); + out.put("vendor", vendor); + out.put("vendorTaxId", vendorTaxId); + out.put("remark", remark); + out.put("drawer", StrUtil.getRecordStr(order, "settlement_user_name")); + + return out; + } + + public File getPrintFile(Record order) { + long st = System.currentTimeMillis(); + Map data = getPrintModel(order); + + if (data == null) { + return null; + } + + FileOutputStream output = null; + Workbook wb = null; + + try { + wb = ExcelHelper.genExcel(data, new File(PathKit.getRootClassPath() + "/tpl.xlsx")); + log.debug("生成文件耗时1:%s", System.currentTimeMillis() - st); + + File out = new File(String.format("%s%s%s-%d.xlsx", + Config.getRootPath() + File.separator + Const.PringExcelTmpFolder, + File.separator, + order.getStr("sn"), + System.currentTimeMillis() + )); + + output = new FileOutputStream(out); + wb.write(output); + + log.debug("生成票据打印文件: %s", out.getAbsolutePath()); + log.debug("生成文件耗时2:%s", System.currentTimeMillis() - st); + + return out; + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } finally { + if (output != null) { + try { + output.flush(); + output.close(); + output = null; + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + + if (wb != null) { + try { + wb.close(); + wb = null; + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + } + } + + /** + * 打印已经完成的订单 + * + * @param sn + * @param printerId + * @return + */ + public Result print(String sn, String printerId, Sysuser sysuser) { + if (StrKit.isBlank(sn)) { + return Result.failed("sn 不能为 null"); + } + + BaseModel order = getOrderBySn(sn); + + if (order == null) { + return Result.failed("未找到订单信息"); + } + + if (order.getInt("state") != OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("订单未完成、或者已经取消"); + } + + 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()); + + try { + Config.deviceThread.print(printerId, getPrintFile(printdata)); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed("打印指令失败"); + } + + Record cmd = new Record(); + cmd.set("cmd", "print"); + cmd.set("sn", sn); + cmd.set("printer", printerId); + ActionCmdLogService.me.save(cmd.toJson(), sysuser); + + return Result.success("打印指令已发送"); + } + + /** + * 按 sn 查询订单相关信息 + * + * @param sn + * @return + */ + public BaseModel getOrderBySn(String sn) { + if (StrKit.isBlank(sn)) { + return null; + } + + int sntype = Integer.parseInt(sn.substring(10, 12)); + + if (sntype == OrderTypeEnum.SALE.getTypeid()) { + return OrderSale.dao.findById(sn); + } else if (sntype == OrderTypeEnum.TRANSFER.getTypeid()) { + return OrderTransfer.dao.findById(sn); + } else if (sntype == OrderTypeEnum.TEMP.getTypeid()) { + return OrderTemp.dao.findById(sn); + } else if (sntype == OrderTypeEnum.TRASH.getTypeid()) { + return OrderTrash.dao.findById(sn); + } else if (sntype == OrderTypeEnum.PURCHASE.getTypeid()) { + return OrderPurchase.dao.findById(sn); + } else { + return null; + } + } + + /** + * 银行支付成功 + * + * @return + */ + public boolean completeBocomm(String MerTranNo) { + return false; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordercluster/OrderclusterController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordercluster/OrderclusterController.java new file mode 100644 index 0000000..e5b7b86 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordercluster/OrderclusterController.java @@ -0,0 +1,59 @@ +package com.cowr.local.ssjygl.order.ordercluster; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Ordercluster; +import com.cowr.ssjygl.order.ordercluster.OrderclusterPKValidator; +import com.cowr.ssjygl.order.ordercluster.OrderclusterService; +import com.cowr.ssjygl.supermarket.SupermarketIdValidator; +import com.jfinal.aop.Before; + +public class OrderclusterController extends BaseController { + + /** + * 分页查找 ordercluster 订单簇 - 集团客户订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String customer_name = get("customer_name"); + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_id = getInt("customer_id"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer trans_co_id = getInt("trans_co_id"); + renderJson(Result.object(OrderclusterService.me.find(pp, supermarket_id, trans_co_id, customer_id, customer_name, stm, etm, product_id, state))); + } + + public void findChildren() { + PageParam pp = getBean(PageParam.class, "", true); + int ordercluster_id = getInt("ordercluster_id", 0); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer isprepaid = getInt("isprepaid"); + renderJson(Result.object(OrderclusterService.me.findChildren(pp, ordercluster_id, sn, truck_license, stm, etm, isprepaid, product_id, state))); + } + + /** + * 按主键查找单个对象 ordercluster 订单簇 - 集团客户订单 + */ + @Before(OrderclusterPKValidator.class) + public void get() { + Ordercluster model = getModel(Ordercluster.class, "", true); // 忽略不在model中的字段 + renderJson(OrderclusterService.me.findByPk(model)); + } + + @Before(SupermarketIdValidator.class) + public void undoneOrdercluster() { + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_id = getInt("customer_id"); + + renderJson(Result.object(OrderclusterService.me.undoneOrdercluster(supermarket_id, customer_id))); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseController.java new file mode 100644 index 0000000..59f6bd9 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseController.java @@ -0,0 +1,98 @@ +package com.cowr.local.ssjygl.order.orderpurchase; + +import com.cowr.common.base.BaseController; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.order.OrderCancelValidator; +import com.cowr.ssjygl.order.SnValidator; +import com.cowr.ssjygl.order.orderpurchase.OrderPurchasePKValidator; +import com.cowr.ssjygl.order.orderpurchase.OrderPurchaseService; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +public class OrderPurchaseController extends BaseController { + private static Log log = Log.getLog(OrderPurchaseController.class); + + @Before(OrderPurchasePKValidator.class) + public void get() { + renderJson(Result.object(OrderPurchaseService.me.get(get("sn")))); + } + + /** + * 分页查找 order_purchase 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + + renderJson(Result.object(OrderPurchaseService.me.find(pp, sn, truck_license, supermarket_id, sandfarm_id, stm, etm, product_id, state))); + } + + @Before(OrderPurchasePayValidator.class) + public void pay() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String uuid = get("uuid"); + String transport_id = get("transport_id"); + Integer purchase_id = getInt("purchase_id"); + Integer product_id = getInt("product_id"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + Double source_weight = getParaToDouble("source_weight"); + + renderJson(OrderPurchaseSyncService.me.pay(uuid, transport_id, purchase_id, product_id, printer, source_weight, tokenuser)); + } + + /** + * 订单取消 + */ + @Before(OrderCancelValidator.class) + public void cancel() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String password = get("password"); + + renderJson(OrderPurchaseSyncService.me.cancel(sn, tokenuser, password)); + } + + @Before(SnValidator.class) + public void print() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.PURCHASE.getTypeid()) { + renderJson(Result.failed("sn 不能为 null")); + }else{ + renderJson(OrderService.me.print(sn, printer, tokenuser)); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchasePayValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchasePayValidator.java new file mode 100644 index 0000000..060c1d1 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchasePayValidator.java @@ -0,0 +1,25 @@ +package com.cowr.local.ssjygl.order.orderpurchase; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; + +public class OrderPurchasePayValidator extends CrudParamValidator { + + @Override + protected void validate(Controller c) { + validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); + validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); + validateInteger("purchase_id", 1, 2147483647, "purchase_id", "purchase_id 范围 1~2147483647"); + validateInteger("product_id", 1, 2147483647, "product_id", "product_id 范围 1~2147483647"); + + if(StrKit.notBlank(c.get("source_weight"))){ + validateDouble("source_weight", 1, 9999, "source_weight", "source_weight 范围 1~999"); + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseSyncService.java new file mode 100644 index 0000000..46831e2 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderpurchase/OrderPurchaseSyncService.java @@ -0,0 +1,241 @@ +package com.cowr.local.ssjygl.order.orderpurchase; + +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.order.orderseq.OrderSeqService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.*; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistanceService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.Date; + +public class OrderPurchaseSyncService { + public static OrderPurchaseSyncService me = new OrderPurchaseSyncService(); + private static Log log = Log.getLog(OrderPurchaseSyncService.class); + + /** + * @param uuid 避免重复提交 + * @param transport_id 运输记录id + * @param purchase_id 采购点id + * @param product_id 品类id + * @param printerId 打印机id + * @param source_weight 底单重量 + * @param sysuser 用户 + * @return + */ + public Result pay( + String uuid, + String transport_id, + Integer purchase_id, + Integer product_id, + String printerId, + Double source_weight, + Sysuser sysuser + ) { + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + + if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("进出场记录已完结或者已作废,不能使用"); + } + + Product product = Product.dao.findById(product_id); + + if (product == null) { + return Result.failedstr("没有找到商品信息【%s】", product_id); + } + + Purchase purchase = Purchase.dao.findById(purchase_id); + + if (purchase == null) { + return Result.failedstr("没有找到采购点信息【%s】", purchase_id); + } + + BigDecimal min = new BigDecimal(0.001); + Date now = new Date(); + SyncTask synctask = new SyncTask(); + OrderPurchase order = new OrderPurchase(); + order.setUuid(uuid); + + if (order.checkDuplicate("uuid")) { + return Result.failed("【%s】已经存在", uuid); + } + + // 验证重量 + 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 net_weight = transport.getFirstWeight().subtract(transport.getSecondWeight()); // 转运的用第一次减第二次 + + if (source_weight != null) { + order.setSourceWeight(new BigDecimal(source_weight)); + } + + order.setTransportId(transport.getId()); + order.setSupermarketId(transport.getSupermarketId()); + order.setTruckLicense(transport.getTruckLicense()); + order.setProductId(product.getId()); + order.setProductName(product.getName()); + order.setPurchaseId(purchase_id); + order.setWeight(net_weight); // 使用净重更新重量 + + order.setCreateUserId(sysuser.getId()); + order.setCreateUserName(sysuser.getName()); + order.setSettlementUserId(sysuser.getId()); + order.setSettlementUserName(sysuser.getName()); + + order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 + order.setCreateTime(now); + + Truck truck = Truck.dao.findById(transport.getTruckLicense()); + + if (truck != null) { + TransportCompany tc = TransportCompany.dao.findById(truck.getTransCoId()); + + if (tc != null) { + // 物流公司信息 + order.setTransCoId(truck.getTransCoId()); + order.setTransCoAddress(tc.getAddress()); + order.setTransCoBankAccount(tc.getBankAccount()); + order.setTransCoBankName(tc.getBankName()); + order.setTransCoName(tc.getName()); + order.setTransCoPhone(tc.getPhone()); + order.setTransCoTexpayerName(tc.getTexpayerName()); + order.setTransCoTexpayerNum(tc.getTexpayerNum()); + + // 有物流公司才计算运费 + order.setTransDistance(SupermarketSandfarmDistanceService.me.getDistance(transport.getSupermarketId(), purchase_id)); + order.setTransUnitPrice(new BigDecimal(TransPriceService.me.getTransferStartTransPrice(order.getTransDistance().doubleValue()))); + // 支付时,用净重计算运费 + order.setTransPrice(new BigDecimal(TransPriceService.me.caleTransferTransPrice(order.getTransCoId(), net_weight.doubleValue(), order.getTransDistance().doubleValue()))); + } + } + + // 更新 transport 出入场信息 + transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 + transport.setArriveTime(now); + transport.setType(OrderTypeEnum.PURCHASE.getTypeid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + order.setSn(OrderSeqService.me.getNextSn(transport.getSupermarketId(), OrderTypeEnum.PURCHASE.getTypeid())); + transport.setOrderSn(order.getSn()); + + boolean ret = order.save() && transport.update(); + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), product_id); + if (stock == null) { + log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); + return false; + } + + stock.setStockWeight(stock.getStockWeight().add(net_weight)); // 采购加库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + // 在这里更新sn字段之后存入 + synctask.addSaveData(order); + synctask.addUpdateData(transport); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + } + + public Result cancel(String sn, Sysuser sysuser, String password) { + // TODO: 判断权限 + + OrderPurchase order = OrderPurchase.dao.findById(sn); + + if (order == null) { + return Result.failedstr("按订单号【%s】未找到记录", sn); + } + + int orderstate = order.getState(); + + // 订单已经完成 + if (orderstate == OrderStateEnum.RECEIVED.getStateid()) { + // 已完成订单,再删除时需要重新验证密码 + Sysuser chkuser = SysuserService.me.getUserByWhere(null, sysuser.getPhone(), password); + + if (chkuser == null) { + log.debug("用户输入密码错误"); + return Result.permissionDenied(); + } + } + + if (orderstate == OrderStateEnum.INVALID.getStateid()) { + return Result.failed("订单已经取消"); + } + + order.setState(OrderStateEnum.INVALID.getStateid()); // 将订单状态置为 9 + + Record logrecord = new Record(); + logrecord.set("sn", sn); + logrecord.set("state", OrderStateEnum.INVALID.getStateid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + 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().subtract(order.getWeight())); // 取消转运减库存 + + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(order); + synctask.addUpdateData(stock); + + return order.update() && stock.update() + && 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); + return false; + } + } + }); + + return ret ? Result.success(order) : Result.failed("取消失败"); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleController.java new file mode 100644 index 0000000..1c721ec --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleController.java @@ -0,0 +1,124 @@ +package com.cowr.local.ssjygl.order.ordersale; + +import com.cowr.common.base.BaseController; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.order.OrderCancelValidator; +import com.cowr.ssjygl.order.SnValidator; +import com.cowr.ssjygl.order.ordersale.OrderSalePKValidator; +import com.cowr.ssjygl.order.ordersale.OrderSaleService; +import com.jfinal.aop.Before; + +public class OrderSaleController extends BaseController { + + @Before(OrderSalePKValidator.class) + public void get(){ + renderJson(Result.object(OrderSaleService.me.get(get("sn")))); + } + + /** + * 分页查找 order_sale 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String customer_name = get("customer_name"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer trans_co_id = getInt("trans_co_id"); + Integer isprepaid = getInt("isprepaid"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(OrderSaleService.me.find(pp, sn, truck_license, supermarket_id, trans_co_id, customer_id, customer_name, stm, etm, isprepaid, product_id, state))); + } + + /** + * 订单支付 + */ + @Before(OrderSalePayValidator.class) + public void pay() { + Sysuser tokenuser = SysuserService.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 driver_name = get("driver_name"); + String driver_phone = get("driver_phone"); + String memo = get("memo"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + renderJson(OrderSaleSyncService.me.pay(uuid, transport_id, ordercluster_id, driver_name, driver_phone, memo, printer, tokenuser)); + } + /** + * 订单支付 + */ + @Before(OrderSalePayValidator.class) + public void prepay() { + Sysuser tokenuser = SysuserService.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 driver_name = get("driver_name"); + String driver_phone = get("driver_phone"); + String memo = get("memo"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + renderJson(OrderSaleSyncService.me.prepay(uuid, transport_id, ordercluster_id, driver_name, driver_phone, memo, printer, tokenuser)); + } + + /** + * 订单取消 + */ + @Before(OrderCancelValidator.class) + public void cancel() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String password = get("password"); + + renderJson(OrderSaleSyncService.me.cancel(sn, tokenuser, password)); + } + + @Before(SnValidator.class) + public void print() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.SALE.getTypeid()) { + renderJson(Result.failed("sn 不能为 null")); + }else{ + renderJson(OrderService.me.print(sn, printer, tokenuser)); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSalePayValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSalePayValidator.java new file mode 100644 index 0000000..dea9b60 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSalePayValidator.java @@ -0,0 +1,22 @@ +package com.cowr.local.ssjygl.order.ordersale; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class OrderSalePayValidator extends CrudParamValidator { + + @Override + protected void validate(Controller c) { + validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); + validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); + validateInteger("ordercluster_id", 1, 2147483647, "ordercluster_id", "ordercluster_id 范围 1~2147483647"); + validateString("driver_name", 0, 8, "driver_name", "driver_name 长度 0~8"); + validateString("driver_phone", 0, 11, "driver_phone", "driver_phone 长度 0~11"); + validateString("memo", 0, 11, "memo", "memo 长度 0~255"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleSyncService.java new file mode 100644 index 0000000..a6de942 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordersale/OrderSaleSyncService.java @@ -0,0 +1,629 @@ +package com.cowr.local.ssjygl.order.ordersale; + +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.utils.DateTimeUtil; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.order.orderseq.OrderSeqService; +import com.cowr.local.ssjygl.supermarket.product.SupermarketProductService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.*; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.Date; + +public class OrderSaleSyncService { + public static OrderSaleSyncService me = new OrderSaleSyncService(); + private static Log log = Log.getLog(OrderSaleSyncService.class); + + /** + * 销售订单支付 + * 1.销售订单必要条件,1.物流公司车辆 + * + * @param uuid 防止前端重复提交 + * @param transport_id + * @return 返回 Result 能带上错误相关的信息描述 + */ + public Result pay( + String uuid, + String transport_id, + Integer ordercluster_id, + String driver_name, + String driver_phone, + String memo, + String printerId, + Sysuser sysuser + ) { + Transport transport = Transport.dao.findById(transport_id); + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + + if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("进出场记录以完成,或者已经被取消,不能使用"); + } + + if(Truck.dao.findById(transport.getTruckLicense()) == null){ + return Result.failedstr("【%s】不是物流公司车辆", transport.getTruckLicense()); + } + + Ordercluster ordercluster = Ordercluster.dao.findById(ordercluster_id); + if (ordercluster == null) { + return Result.failedstr("集团订单【%s】信息不存在", ordercluster_id); + } + + Customer customer = Customer.dao.findById(ordercluster.getCustomerId()); + if (customer == null) { + return Result.failedstr("集团订单关联客户信息【%s】信息不存在", ordercluster.getCustomerId()); + } + + if (ordercluster.getState() == OrderStateEnum.INVALID.getStateid()) { + return Result.failedstr("集团订单【%s】已完结,请重新下单", ordercluster_id); + } + + if (ordercluster.getTransCoId() == null) { + return Result.failedstr("集团订单【%s】没有配置有效的物流公司", ordercluster_id); + } + + BigDecimal up = SupermarketProductService.me.getUnitPrice(transport.getSupermarketId(), ordercluster.getProductId()); + + if (up == null) { + return Result.failedstr("未查到有效的单价信息"); + } + + OrderSale order = new OrderSale(); + order.setUuid(uuid); + + if (order.checkDuplicate("uuid")) { + return Result.failed("【%s】已经存在", uuid); + } + + BigDecimal min = new BigDecimal("0.001"); + Date now = new Date(); + SyncTask synctask = new SyncTask(); + + // 验证重量 + 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 net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()); // 销售的用第二次减第一次 + + order.setTransportId(transport.getId()); + order.setSupermarketId(transport.getSupermarketId()); + order.setTruckLicense(transport.getTruckLicense()); + + // 运输信息 + order.setProductId(ordercluster.getProductId()); + order.setProductName(ordercluster.getProductName()); + order.setTransDistance(ordercluster.getTransDistance()); + order.setTransUnitPrice(BigDecimal.valueOf(TransPriceService.me.getOrderStartTransPrice(ordercluster.getTransCoId(), order.getTransDistance().doubleValue()))); + // 支付时,用净重计算运费 + order.setTransPrice(BigDecimal.valueOf(TransPriceService.me.caleOrderTransPrice(ordercluster.getTransCoId(), net_weight.doubleValue(), order.getTransDistance().doubleValue()))); + order.setDriverName(driver_name); + order.setDriverPhone(driver_phone); + order.setPickTime(ordercluster.getCutoffTime()); // 集团订单的截止时间 + + // 支付信息 + order.setUnitPrice(up); + order.setWeight(net_weight); // 使用净重更新重量 + order.setTotalPrice(TransPriceService.me.caleTotalPrice(up, net_weight)); // 获取根据净重和单价计算的总价,作为应付金额 + order.setPaid(order.getTotalPrice()); // 如果有预付费,该字段根据预付费情况设置。实付金额 + order.setPayType(ordercluster.getPayType()); + order.setReqReceipt(ordercluster.getReqReceipt()); + order.setOrderclusterId(ordercluster_id); + + // 客户信息 + order.setCustomerId(ordercluster.getCustomerId()); + order.setCustomerAddress(ordercluster.getCustomerAddress()); + order.setCustomerBankAccount(ordercluster.getCustomerBankAccount()); + order.setCustomerBankName(ordercluster.getCustomerBankName()); + order.setCustomerName(ordercluster.getCustomerName()); + order.setCustomerPhone(ordercluster.getCustomerPhone()); + order.setCustomerTexpayerName(ordercluster.getCustomerTexpayerName()); + order.setCustomerTexpayerNum(ordercluster.getCustomerTexpayerNum()); + + // 客户收货信息 + order.setCustomerReceiverName(ordercluster.getCustomerReceiverName()); + order.setCustomerReceiverPhone(ordercluster.getCustomerReceiverPhone()); + order.setCustomerReceiverAddress(ordercluster.getCustomerReceiverAddress()); + order.setCustomerReceiverLgtd(ordercluster.getCustomerReceiverLgtd()); + order.setCustomerReceiverLttd(ordercluster.getCustomerReceiverLttd()); + + // 物流公司信息 + 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()); + + order.setCreateUserId(ordercluster.getCreateUserId()); + order.setCreateUserName(ordercluster.getCreateUserName()); + order.setSettlementUserId(sysuser.getId()); + order.setSettlementUserName(sysuser.getName()); + + order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 + order.setCreateTime(now); + order.setMemo(memo); // 备注 + + // 更新 transport 出入场信息 + 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()); + transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 + transport.setArriveTime(now); + transport.setType(OrderTypeEnum.SALE.getTypeid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = false; + order.setSn(OrderSeqService.me.getNextSn(transport.getSupermarketId(), OrderTypeEnum.SALE.getTypeid())); + transport.setOrderSn(order.getSn()); + + ret = order.save() && transport.update(); + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId()); + if (stock == null) { + log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); + return false; + } + + stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + // 在这里更新sn字段之后存入 + synctask.addSaveData(order); + synctask.addUpdateData(transport); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + } + + public Result prepay( + String uuid, + String transport_id, + Integer ordercluster_id, + String driver_name, + String driver_phone, + String memo, + String printerId, + Sysuser sysuser + ) { + 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(Truck.dao.findById(transport.getTruckLicense()) == null){ + return Result.failedstr("【%s】不是物流公司车辆", transport.getTruckLicense()); + } + + Ordercluster ordercluster = Ordercluster.dao.findById(ordercluster_id); + if (ordercluster == null) { + return Result.failedstr("集团订单【%s】信息不存在", ordercluster_id); + } + + Customer customer = Customer.dao.findById(ordercluster.getCustomerId()); + if (customer == null) { + return Result.failedstr("集团订单关联客户信息【%s】信息不存在", ordercluster.getCustomerId()); + } + + if (customer.getType() != 1) { + return Result.failed("不是预付费客户"); + } + + if (ordercluster.getState() == OrderStateEnum.INVALID.getStateid()) { + return Result.failedstr("集团订单【%s】已完结,请重新下单", ordercluster_id); + } + + if (ordercluster.getTransCoId() == null) { + return Result.failedstr("集团订单【%s】没有配置有效的物流公司", ordercluster_id); + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), transport.getSupermarketId()); + + if (prepayCustomer == null) { + return Result.failed("没有找到客户预付费信息"); + } + + if (prepayCustomer.getSurplus() == null || prepayCustomer.getSurplus().compareTo(min) == 0) { + return Result.failed("客户余额不足"); + } + + PrepayTruck pt = PrepayTruck.dao.findFirst("select * from prepay_truck t \n" + + " where t.supermarket_id = ? \n" + + " and t.truck_license = ? \n" + + " and t.valid_date = ? ", + transport.getSupermarketId(), + transport.getTruckLicense(), + DateTimeUtil.sdf.get().format(transport.getInTime()) + ); + + if (pt == null) { + return Result.failedstr("【%s】不是今日预付费车辆", transport.getTruckLicense()); + } + + if(pt.getType() != OrderTypeEnum.SALE.getTypeid()){ + return Result.failedstr("【%s】不是配送预付费车辆", transport.getTruckLicense()); + } + + BigDecimal up = SupermarketProductService.me.getUnitPrice(transport.getSupermarketId(), ordercluster.getProductId()); + + if (up == null) { + return Result.failedstr("未查到有效的单价信息"); + } + + OrderSale order = new OrderSale(); + order.setUuid(uuid); + + if (order.checkDuplicate("uuid")) { + return Result.failed("【%s】已经存在", uuid); + } + + Date now = new Date(); + SyncTask synctask = new SyncTask(); + + // 验证重量 + 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 net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()); // 销售的用第二次减第一次 + + order.setTransportId(transport.getId()); + order.setSupermarketId(transport.getSupermarketId()); + order.setTruckLicense(transport.getTruckLicense()); + + // 运输信息 + order.setProductId(ordercluster.getProductId()); + order.setProductName(ordercluster.getProductName()); + order.setTransDistance(ordercluster.getTransDistance()); + order.setTransUnitPrice(BigDecimal.valueOf(TransPriceService.me.getOrderStartTransPrice(ordercluster.getTransCoId(), order.getTransDistance().doubleValue()))); + // 支付时,用净重计算运费 + order.setTransPrice(BigDecimal.valueOf(TransPriceService.me.caleOrderTransPrice(ordercluster.getTransCoId(), net_weight.doubleValue(), order.getTransDistance().doubleValue()))); + order.setDriverName(driver_name); + order.setDriverPhone(driver_phone); + order.setPickTime(ordercluster.getCutoffTime()); // 集团订单的截止时间 + + // 支付信息 + order.setUnitPrice(up); + order.setWeight(net_weight); // 使用净重更新重量 + order.setTotalPrice(TransPriceService.me.caleTotalPrice(up, net_weight)); // 获取根据净重和单价计算的总价,作为应付金额 + order.setPaid(order.getTotalPrice()); // 如果有预付费,该字段根据预付费情况设置。实付金额 + order.setPayType(ordercluster.getPayType()); + order.setReqReceipt(ordercluster.getReqReceipt()); + order.setOrderclusterId(ordercluster_id); + + // 客户信息 + order.setCustomerId(ordercluster.getCustomerId()); + order.setCustomerAddress(ordercluster.getCustomerAddress()); + order.setCustomerBankAccount(ordercluster.getCustomerBankAccount()); + order.setCustomerBankName(ordercluster.getCustomerBankName()); + order.setCustomerName(ordercluster.getCustomerName()); + order.setCustomerPhone(ordercluster.getCustomerPhone()); + order.setCustomerTexpayerName(ordercluster.getCustomerTexpayerName()); + order.setCustomerTexpayerNum(ordercluster.getCustomerTexpayerNum()); + + // 客户收货信息 + order.setCustomerReceiverName(ordercluster.getCustomerReceiverName()); + order.setCustomerReceiverPhone(ordercluster.getCustomerReceiverPhone()); + order.setCustomerReceiverAddress(ordercluster.getCustomerReceiverAddress()); + order.setCustomerReceiverLgtd(ordercluster.getCustomerReceiverLgtd()); + order.setCustomerReceiverLttd(ordercluster.getCustomerReceiverLttd()); + + // 物流公司信息 + 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()); + + order.setCreateUserId(ordercluster.getCreateUserId()); + order.setCreateUserName(ordercluster.getCreateUserName()); + order.setSettlementUserId(sysuser.getId()); + order.setSettlementUserName(sysuser.getName()); + + order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 + order.setCreateTime(now); + order.setMemo(memo); // 备注 + + // 更新 transport 出入场信息 + 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()); + transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 + transport.setArriveTime(now); + transport.setType(OrderTypeEnum.SALE.getTypeid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = false; + order.setSn(OrderSeqService.me.getNextSn(transport.getSupermarketId(), OrderTypeEnum.SALE.getTypeid())); + transport.setOrderSn(order.getSn()); + + // 是预付费用户,并且还有余额 + order.setIsprepaid(1); + order.setPaid(new BigDecimal(0)); // 预付费的实际支付为 0 + order.setPrepayCustomerId(prepayCustomer.getId()); + prepayCustomer.setSpendTime(now); + + if (prepayCustomer.getSurplus().compareTo(order.getTotalPrice()) > -1) { + prepayCustomer.setSurplus(prepayCustomer.getSurplus().subtract(order.getTotalPrice())); + } else { + // 对于支付的差额,算作一次即充即用的预付费充值 + prepayCustomer.setSurplus(new BigDecimal(0)); + + String paidmemo = "现场补足预付金额:" + order.getPaid().intValue() + "元"; + + if (StrKit.isBlank(order.getMemo())) { + order.setMemo(paidmemo); + } else { + order.setMemo(order.getMemo() + "。" + paidmemo); + } + + PrepayDetail pd = new PrepayDetail(); + pd.setId(StrKit.getRandomUUID()); + pd.setCustomerId(order.getCustomerId()); + pd.setSupermarketId(order.getSupermarketId()); + pd.setAmount(order.getTotalPrice().subtract(prepayCustomer.getSurplus())); // 订单总价减去余额,就是本次补的差价 + pd.setType(2); + pd.setContactName(""); + pd.setContactPhone(""); + pd.setBankName(""); + pd.setSerialnum(""); + pd.setState(2); + pd.setChangeTime(now); + pd.setCreateTime(now); + pd.setVerifyTime(now); + + ret = pd.save(); + if (!ret) { + return false; + } + + synctask.addSaveData(pd); + + PrepayDetailStateHistory his = new PrepayDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setPrepayDetailId(pd.getId()); + his.setChangeUserId(sysuser.getId()); + his.setChangeUserName(sysuser.getName()); + his.setState(1); + his.setChangeTime(now); + his.setMemo(paidmemo); + + ret = his.save(); + if (!ret) { + return false; + } + + synctask.addSaveData(his); + + his = new PrepayDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setPrepayDetailId(pd.getId()); + his.setChangeUserId(sysuser.getId()); + his.setChangeUserName(sysuser.getName()); + his.setState(2); + his.setChangeTime(now); + his.setMemo(paidmemo); + + ret = his.save(); + if (!ret) { + return false; + } + + synctask.addSaveData(his); + } + + synctask.addUpdateData(prepayCustomer); + + ret = prepayCustomer.update(); + + if (!ret) { + return false; + } + + ret = order.save() && transport.update(); + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId()); + if (stock == null) { + log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); + return false; + } + + stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + // 在这里更新sn字段之后存入 + synctask.addSaveData(order); + synctask.addUpdateData(transport); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + } + + public Result cancel(String sn, Sysuser sysuser, String password) { + // TODO: 判断权限 + + OrderSale order = OrderSale.dao.findById(sn); + + if (order == null) { + return Result.failedstr("按订单号【%s】未找到记录", sn); + } + + int orderstate = order.getState(); + + // 订单已经完成 + if (orderstate == OrderStateEnum.RECEIVED.getStateid()) { + // 已完成订单,再删除时需要重新验证密码 + Sysuser chkuser = SysuserService.me.getUserByWhere(null, sysuser.getPhone(), password); + + if (chkuser == null) { + log.debug("用户输入密码错误"); + return Result.permissionDenied(); + } + } + + if (orderstate == OrderStateEnum.INVALID.getStateid()) { + return Result.failed("订单已经取消"); + } + + order.setState(OrderStateEnum.INVALID.getStateid()); // 将订单状态置为 9 + + Record logrecord = new Record(); + logrecord.set("sn", sn); + logrecord.set("state", OrderStateEnum.INVALID.getStateid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(order); + + boolean ret = order.update() + && ModifyLogService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser); + + if (!ret) { + return false; + } + + // 是集团客户订单 + if (order.getOrderclusterId() != null) { + Ordercluster ordercluster = Ordercluster.dao.findById(order.getOrderclusterId()); + + if (ordercluster == null) { + log.error("关联集团订单信息未找到,ordercluster_id:【%s】", order.getOrderclusterId()); + return false; + } + } + + // 是预付费订单 + if (order.getIsprepaid() == 1) { + Customer customer = Customer.dao.findById(order.getCustomerId()); + + if (customer == null) { + log.error("关联预付费客户信息未找到,customer_id:【%s】", order.getCustomerId()); + return false; + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), order.getSupermarketId()); + + if (prepayCustomer != null) { + if (prepayCustomer.getSurplus() == null) { + prepayCustomer.setSurplus(order.getTotalPrice()); + } else { + prepayCustomer.setSurplus(prepayCustomer.getSurplus().add(order.getTotalPrice())); + } + + synctask.addUpdateData(prepayCustomer); + + ret = prepayCustomer.update(); + } + } + + if (!ret) { + 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(); + + synctask.addUpdateData(stock); + + return ret && SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.success(order) : Result.failed("取消失败"); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderseq/OrderSeqService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderseq/OrderSeqService.java new file mode 100644 index 0000000..9195918 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/orderseq/OrderSeqService.java @@ -0,0 +1,53 @@ +package com.cowr.local.ssjygl.order.orderseq; + +import com.cowr.common.Const; +import com.cowr.model.OrderSeq; +import com.jfinal.log.Log; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class OrderSeqService { + public static OrderSeqService me = new OrderSeqService(); + private static Log log = Log.getLog(OrderSeqService.class); + private static final ThreadLocal orderday = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyyMMdd"); + } + }; + + /** + * 获取下一个序列号 + * 需要放到事务中使用 + * @param supermarket_id + * @param type + * @return + * @throws Exception + */ + public String getNextSn(int supermarket_id, int type) throws Exception { + java.sql.Date now = new java.sql.Date(System.currentTimeMillis()); // 使用 java.sql.Date 只保留日期 + // 复合主键,这里的顺序和数据库中的一致 + OrderSeq seq = OrderSeq.dao.findByIds(now, supermarket_id, type); // 这里直接使用 Date 作为查询条件,需要注意 mysql 连接字符串上加上 &serverTimezone=GMT+8 + + if (seq == null) { + seq = new OrderSeq(); + seq.setTm(now); + seq.setSupermarketId(supermarket_id); + seq.setType(type); + seq.setSeq(1); + + seq.save(); + } else { + if (seq.getSeq() >= Const.DEFAULT_SN_MAX) { + throw new Exception("序列号超出最大长度限制"); + } else { + seq.setSeq(seq.getSeq() + 1); + + seq.update(); + } + } + + // YYYYMMDD + 两位销售点id(避免离线生成订单号重复) + 两位订单类型 + 四位序列号 + return orderday.get().format(new Date()) + String.format("%02d%02d%0" + Const.DEFAULT_SN_LEN + "d", supermarket_id, type, seq.getSeq()); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java new file mode 100644 index 0000000..e233362 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempController.java @@ -0,0 +1,135 @@ +package com.cowr.local.ssjygl.order.ordertemp; + +import com.cowr.common.base.BaseController; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.order.OrderCancelValidator; +import com.cowr.ssjygl.order.SnValidator; +import com.cowr.ssjygl.order.ordertemp.OrderTempPKValidator; +import com.cowr.ssjygl.order.ordertemp.OrderTempService; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +public class OrderTempController extends BaseController { + private static Log log = Log.getLog(OrderTempController.class); + + @Before(OrderTempPKValidator.class) + public void get() { + renderJson(Result.object(OrderTempService.me.get(get("sn")))); + } + + /** + * 分页查找 order_temp 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String customer_name = get("customer_name"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer isprepaid = getInt("isprepaid"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(OrderTempService.me.find(pp, sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, product_id, state))); + } + + @Before(OrderTempPayValidator.class) + public void pay() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String uuid = get("uuid"); + String transport_id = get("transport_id"); + Integer product_id = getInt("product_id"); + Integer pay_type = getInt("pay_type"); + String memo = get("memo"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + renderJson(OrderTempSyncService.me.pay(uuid, transport_id, product_id, pay_type, memo, printer, tokenuser)); + } + + + @Before(OrderTempPayValidator.class) + public void payordercluster() { + Sysuser tokenuser = SysuserService.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 memo = get("memo"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + renderJson(OrderTempSyncService.me.payordercluster(uuid, transport_id, ordercluster_id, memo, printer, tokenuser)); + } + + @Before(OrderTempPrepayValidator.class) + public void prepay() { + Sysuser tokenuser = SysuserService.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"); + Integer product_id = getInt("product_id"); + String memo = get("memo"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + renderJson(OrderTempSyncService.me.prepay(uuid, transport_id, ordercluster_id, product_id, memo, printer, tokenuser)); + } + + /** + * 订单取消 + */ + @Before(OrderCancelValidator.class) + public void cancel() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String password = get("password"); + + renderJson(OrderTempSyncService.me.cancel(sn, tokenuser, password)); + } + + @Before(SnValidator.class) + public void print() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TEMP.getTypeid()) { + renderJson(Result.failed("sn 不能为 null")); + } else { + renderJson(OrderService.me.print(sn, printer, tokenuser)); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPayValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPayValidator.java new file mode 100644 index 0000000..1d90dd5 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPayValidator.java @@ -0,0 +1,25 @@ +package com.cowr.local.ssjygl.order.ordertemp; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class OrderTempPayValidator extends CrudParamValidator { + + @Override + protected void validate(Controller c) { + validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); + validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); + if (c.get("ordercluster_id") == null) { + validateInteger("product_id", 1, 2147483647, "product_id", "product_id 范围 1~2147483647"); + validateInteger("pay_type", 1, 2, "pay_type", "pay_type 只能选 1 或者 2"); + } else { + validateInteger("ordercluster_id", 1, 2147483647, "ordercluster_id", "ordercluster_id 范围 1~2147483647"); + } + validateString("memo", 0, 11, "memo", "memo 长度 0~255"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPrepayValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPrepayValidator.java new file mode 100644 index 0000000..0e24837 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempPrepayValidator.java @@ -0,0 +1,27 @@ +package com.cowr.local.ssjygl.order.ordertemp; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +/** + * 预付费表单验证 + */ +public class OrderTempPrepayValidator extends CrudParamValidator { + + @Override + protected void validate(Controller c) { + validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); + validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); + if (c.get("ordercluster_id") == null) { + validateInteger("product_id", 1, 2147483647, "product_id", "product_id 范围 1~2147483647"); + } else { + validateInteger("ordercluster_id", 1, 2147483647, "ordercluster_id", "ordercluster_id 范围 1~2147483647"); + } + validateString("memo", 0, 11, "memo", "memo 长度 0~255"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} 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 new file mode 100644 index 0000000..8e919f3 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertemp/OrderTempSyncService.java @@ -0,0 +1,735 @@ +package com.cowr.local.ssjygl.order.ordertemp; + +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.utils.DateTimeUtil; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.order.orderseq.OrderSeqService; +import com.cowr.local.ssjygl.supermarket.product.SupermarketProductService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.*; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; +import com.cowr.ssjygl.supermarket.SupermarketService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.Date; + +public class OrderTempSyncService { + public static OrderTempSyncService me = new OrderTempSyncService(); + private static Log log = Log.getLog(OrderTempSyncService.class); + + public Result pay( + String uuid, + String transport_id, + Integer product_id, + Integer pay_type, + String memo, + String printerId, + Sysuser sysuser + ) { + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + + if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("进出场记录已完结或者已作废,不能使用"); + } + + Product product = Product.dao.findById(product_id); + + if (product == null) { + return Result.failedstr("没有找到商品信息【%s】", product_id); + } + + BigDecimal up = SupermarketProductService.me.getUnitPrice(transport.getSupermarketId(), product.getId()); + + if (up == null) { + return Result.failedstr("未查到有效的单价信息"); + } + + BigDecimal min = new BigDecimal(0.001); + Date now = new Date(); + SyncTask synctask = new SyncTask(); + OrderTemp order = new OrderTemp(); + order.setUuid(uuid); + + if (order.checkDuplicate("uuid")) { + return Result.failed("【%s】已经存在", uuid); + } + + // 验证重量 + 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 net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()); // 销售的用第二次减第一次 + + order.setTransportId(transport.getId()); + order.setSupermarketId(transport.getSupermarketId()); + order.setTruckLicense(transport.getTruckLicense()); + order.setProductId(product.getId()); + order.setProductName(product.getName()); + + // 支付信息 + order.setUnitPrice(SupermarketService.me.getSupUnitPrice(transport.getSupermarketId(), product.getId())); + order.setWeight(net_weight); // 使用净重更新重量 + order.setTotalPrice(TransPriceService.me.caleTotalPrice(up, net_weight)); // 获取根据净重和单价计算的总价,作为实付金额 + order.setPaid(order.getTotalPrice()); // 实际应付金额,预付费走另外的接口 + order.setPayType(pay_type); // 1.线下支付,2.线上支付,走银行流程 + + order.setCreateUserId(sysuser.getId()); + order.setCreateUserName(sysuser.getName()); + order.setSettlementUserId(sysuser.getId()); + order.setSettlementUserName(sysuser.getName()); + + order.setCreateTime(now); + order.setMemo(memo); // 备注 + + // 更新 transport 出入场信息 + // 线下支付才同步将出入场记录设置为完成 + if(order.getPayType() == 1) { + transport.setArriveTime(now); + order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 + }else{ + order.setState(OrderStateEnum.LEAVE.getStateid()); // 等等付款 + } + transport.setState(order.getState()); // 使用 order 的 state + transport.setType(OrderTypeEnum.TEMP.getTypeid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + order.setSn(OrderSeqService.me.getNextSn(transport.getSupermarketId(), OrderTypeEnum.TEMP.getTypeid())); + transport.setOrderSn(order.getSn()); + + boolean ret = order.save() && transport.update(); + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId()); + if (stock == null) { + log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); + return false; + } + + stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + synctask.addUpdateData(transport); + synctask.addSaveData(order); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + if(order.getPayType() == 1){ + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + }else{ + return ret ? Result.success(order) : Result.failed("结算失败"); + } + } + + public Result payordercluster( + String uuid, + String transport_id, + Integer ordercluster_id, + String memo, + String printerId, + Sysuser sysuser + ) { + + Transport transport = Transport.dao.findById(transport_id); + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + + if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("进出场记录已完结或者已作废,不能使用"); + } + + Ordercluster ordercluster = Ordercluster.dao.findById(ordercluster_id); + if (ordercluster == null) { + return Result.failedstr("集团订单【%s】信息不存在", ordercluster_id); + } + + Customer customer = Customer.dao.findById(ordercluster.getCustomerId()); + if (customer == null) { + return Result.failedstr("客户信息【%s】信息不存在", ordercluster.getCustomerId()); + } + + if (ordercluster.getState() == OrderStateEnum.INVALID.getStateid()) { + return Result.failedstr("集团订单【%s】已完结,请重新下单", ordercluster_id); + } + + BigDecimal up = SupermarketProductService.me.getUnitPrice(transport.getSupermarketId(), ordercluster.getProductId()); + + if (up == null) { + return Result.failedstr("未查到有效的单价信息"); + } + + BigDecimal min = new BigDecimal(0.001); + Date now = new Date(); + SyncTask synctask = new SyncTask(); + OrderTemp order = new OrderTemp(); + order.setUuid(uuid); + + if (order.checkDuplicate("uuid")) { + return Result.failed("【%s】已经存在", uuid); + } + + // 验证重量 + 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 net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()); // 销售的用第二次减第一次 + + order.setTransportId(transport.getId()); + order.setSupermarketId(transport.getSupermarketId()); + order.setTruckLicense(transport.getTruckLicense()); + + // 运输信息 + order.setProductId(ordercluster.getProductId()); + order.setProductName(ordercluster.getProductName()); + + // 支付信息 + order.setUnitPrice(up); + order.setWeight(net_weight); // 使用净重更新重量 + order.setTotalPrice(TransPriceService.me.caleTotalPrice(up, net_weight)); // 获取根据净重和单价计算的总价,作为应付金额 + order.setPaid(order.getTotalPrice()); // 如果有预付费,该字段根据预付费情况设置。实付金额 + order.setPayType(ordercluster.getPayType()); + order.setOrderclusterId(ordercluster_id); + + // 客户信息 + order.setCustomerId(ordercluster.getCustomerId()); + order.setCustomerAddress(ordercluster.getCustomerAddress()); + order.setCustomerBankAccount(ordercluster.getCustomerBankAccount()); + order.setCustomerBankName(ordercluster.getCustomerBankName()); + order.setCustomerName(ordercluster.getCustomerName()); + order.setCustomerPhone(ordercluster.getCustomerPhone()); + order.setCustomerTexpayerName(ordercluster.getCustomerTexpayerName()); + order.setCustomerTexpayerNum(ordercluster.getCustomerTexpayerNum()); + + // 物流公司信息 + 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()); + + order.setCreateUserId(ordercluster.getCreateUserId()); + order.setCreateUserName(ordercluster.getCreateUserName()); + order.setSettlementUserId(sysuser.getId()); + order.setSettlementUserName(sysuser.getName()); + + order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 + order.setCreateTime(now); + order.setMemo(memo); // 备注 + + // 更新 transport 出入场信息 + 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()); + transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 + transport.setArriveTime(now); + transport.setType(OrderTypeEnum.TEMP.getTypeid()); + + 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()); + + ret = order.save() && transport.update(); + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId()); + if (stock == null) { + log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); + return false; + } + + stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + // 在这里更新sn字段之后存入 + synctask.addSaveData(order); + synctask.addUpdateData(transport); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + } + + + public Result prepay( + String uuid, + String transport_id, + Integer ordercluster_id, + Integer product_id, + String memo, + String printerId, + Sysuser sysuser + ) { + 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("进出场记录已完结或者已作废,不能使用"); + } + + PrepayTruck pt = PrepayTruck.dao.findFirst("select * from prepay_truck t \n" + + " where t.supermarket_id = ? \n" + + " and t.truck_license = ? \n" + + " and t.valid_date = ? ", + transport.getSupermarketId(), + transport.getTruckLicense(), + DateTimeUtil.sdf.get().format(transport.getInTime()) + ); + + if (pt == null) { + return Result.failedstr("【%s】不是今日预付费车辆", transport.getTruckLicense()); + } + + Customer customer; + Product product; + Ordercluster ordercluster = null; + + // 验证重量 + 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 net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()); // 销售的用第二次减第一次 + + if (ordercluster_id != null) { + 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); + } + + customer = Customer.dao.findById(ordercluster.getCustomerId()); + product = Product.dao.findById(ordercluster.getProductId()); + + // 物流公司信息 + 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()); + } else { + customer = Customer.dao.findById(pt.getCustomerId()); + + product = Product.dao.findById(product_id); + } + + if (product == null) { + return Result.failedstr("未找到有效的品类信息"); + } + + if (customer == null) { + return Result.failedstr("未找到有效的客户信息"); + } + + if (customer.getType() != 1) { + return Result.failed("不是预付费客户"); + } + + BigDecimal up = SupermarketProductService.me.getUnitPrice(transport.getSupermarketId(), product.getId()); + + if (up == null) { + return Result.failedstr("未查到有效的单价信息"); + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), transport.getSupermarketId()); + + if (prepayCustomer == null) { + return Result.failed("没有找到客户预付费信息"); + } + + if (prepayCustomer.getSurplus() == null || prepayCustomer.getSurplus().compareTo(min) == 0) { + return Result.failed("客户余额不足"); + } + + 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.setCreateTime(now); + order.setMemo(memo); // 备注 + + // 更新 transport 出入场信息 + transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 + transport.setArriveTime(now); + transport.setType(OrderTypeEnum.TEMP.getTypeid()); + + 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()); + prepayCustomer.setSpendTime(now); + + if (prepayCustomer.getSurplus().compareTo(order.getTotalPrice()) > -1) { + prepayCustomer.setSurplus(prepayCustomer.getSurplus().subtract(order.getTotalPrice())); + } else { + // 对于支付的差额,算作一次即充即用的预付费充值 + prepayCustomer.setSurplus(new BigDecimal(0)); + + String paidmemo = "现场补足预付金额:" + order.getPaid().intValue() + "元"; + + if (StrKit.isBlank(order.getMemo())) { + order.setMemo(paidmemo); + } else { + order.setMemo(order.getMemo() + "。" + paidmemo); + } + + PrepayDetail pd = new PrepayDetail(); + pd.setId(StrKit.getRandomUUID()); + pd.setCustomerId(order.getCustomerId()); + pd.setSupermarketId(order.getSupermarketId()); + pd.setAmount(order.getTotalPrice().subtract(prepayCustomer.getSurplus())); // 订单总价减去余额,就是本次补的差价 + pd.setType(2); + pd.setContactName(""); + pd.setContactPhone(""); + pd.setBankName(""); + pd.setSerialnum(""); + pd.setState(2); + pd.setChangeTime(now); + pd.setCreateTime(now); + pd.setVerifyTime(now); + + ret = pd.save(); + if (!ret) { + return false; + } + + synctask.addSaveData(pd); + + PrepayDetailStateHistory his = new PrepayDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setPrepayDetailId(pd.getId()); + his.setChangeUserId(sysuser.getId()); + his.setChangeUserName(sysuser.getName()); + his.setState(1); + his.setChangeTime(now); + his.setMemo(paidmemo); + + ret = his.save(); + if (!ret) { + return false; + } + + synctask.addSaveData(his); + + his = new PrepayDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setPrepayDetailId(pd.getId()); + his.setChangeUserId(sysuser.getId()); + his.setChangeUserName(sysuser.getName()); + his.setState(2); + his.setChangeTime(now); + his.setMemo(paidmemo); + + ret = his.save(); + if (!ret) { + return false; + } + + synctask.addSaveData(his); + } + + synctask.addUpdateData(prepayCustomer); + + ret = prepayCustomer.update(); + + if (!ret) { + return false; + } + + ret = order.save() && transport.update(); + + if (!ret) { + return false; + } + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), order.getProductId()); + if (stock == null) { + log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); + return false; + } + + stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 销售减库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + // 在这里更新sn字段之后存入 + synctask.addSaveData(order); + synctask.addUpdateData(transport); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + } + + + public Result cancel(String sn, Sysuser sysuser, String password) { + // TODO: 判断权限 + + OrderTemp order = OrderTemp.dao.findById(sn); + + if (order == null) { + return Result.failedstr("按订单号【%s】未找到记录", sn); + } + + int orderstate = order.getState(); + + // 订单已经完成 + if (orderstate == OrderStateEnum.RECEIVED.getStateid()) { + // 已完成订单,再删除时需要重新验证密码 + Sysuser chkuser = SysuserService.me.getUserByWhere(null, sysuser.getPhone(), password); + + if (chkuser == null) { + log.debug("用户输入密码错误"); + return Result.permissionDenied(); + } + } + + if (orderstate == OrderStateEnum.INVALID.getStateid()) { + return Result.failed("订单已经取消"); + } + + int oldstate = order.getState(); + order.setState(OrderStateEnum.INVALID.getStateid()); // 将订单状态置为 9 + + Record logrecord = new Record(); + logrecord.set("sn", sn); + logrecord.set("state", OrderStateEnum.INVALID.getStateid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(order); + + boolean ret = order.update() + && ModifyLogService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser); + + if (!ret) { + return false; + } + +// if(oldstate == OrderStateEnum.LEAVE.getStateid() ){ +// Bocomm bocomm = Bocomm.dao.findFirst( +// "select * from bocomm t where t.order_sn = ? and t.state <= ? limit 0,1", +// sn, +// OrderStateEnum.RECEIVED.getStateid() +// ); +// +// if(bocomm != null){ +// ret = BocommService.me.closeTran(bocomm); +// } +// } + + // 是集团客户订单 + if (order.getOrderclusterId() != null) { + Ordercluster ordercluster = Ordercluster.dao.findById(order.getOrderclusterId()); + + if (ordercluster == null) { + log.error("关联集团订单信息未找到,ordercluster_id:【%s】", order.getOrderclusterId()); + return false; + } + } + + // 是预付费订单 + if (order.getIsprepaid() == 1) { + Customer customer = Customer.dao.findById(order.getCustomerId()); + + if (customer == null) { + log.error("关联预付费客户信息未找到,customer_id:【%s】", order.getCustomerId()); + return false; + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), order.getSupermarketId()); + + if (prepayCustomer != null) { + + if (prepayCustomer.getSurplus() == null) { + prepayCustomer.setSurplus(order.getTotalPrice()); + } else { + prepayCustomer.setSurplus(prepayCustomer.getSurplus().add(order.getTotalPrice())); + } + + synctask.addUpdateData(prepayCustomer); + + ret = prepayCustomer.update(); + } + } + + if (!ret) { + 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(); + + synctask.addUpdateData(stock); + + return ret && SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.success(order) : Result.failed("取消失败"); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java new file mode 100644 index 0000000..3133eaa --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferController.java @@ -0,0 +1,98 @@ +package com.cowr.local.ssjygl.order.ordertransfer; + +import com.cowr.common.base.BaseController; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.order.OrderCancelValidator; +import com.cowr.ssjygl.order.SnValidator; +import com.cowr.ssjygl.order.ordertransfer.OrderTransferPKValidator; +import com.cowr.ssjygl.order.ordertransfer.OrderTransferService; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +public class OrderTransferController extends BaseController { + private static Log log = Log.getLog(OrderTransferController.class); + + @Before(OrderTransferPKValidator.class) + public void get(){ + renderJson(Result.object(OrderTransferService.me.get(get("sn")))); + } + + /** + * 分页查找 order_transfer 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + + renderJson(Result.object(OrderTransferService.me.find(pp, sn, truck_license, supermarket_id, sandfarm_id, stm, etm, product_id, state))); + } + + @Before(OrderTransferPayValidator.class) + public void pay() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String uuid = get("uuid"); + String transport_id = get("transport_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + Integer product_id = getInt("product_id"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + Double source_weight = getParaToDouble("source_weight"); + + renderJson(OrderTransferSyncService.me.pay(uuid, transport_id, sandfarm_id, product_id, printer, source_weight, tokenuser)); + } + + /** + * 订单取消 + */ + @Before(OrderCancelValidator.class) + public void cancel() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String password = get("password"); + + renderJson(OrderTransferSyncService.me.cancel(sn, tokenuser, password)); + } + + @Before(SnValidator.class) + public void print() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TRANSFER.getTypeid()) { + renderJson(Result.failed("sn 不能为 null")); + }else{ + renderJson(OrderService.me.print(sn, printer, tokenuser)); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java new file mode 100644 index 0000000..944ed25 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferPayValidator.java @@ -0,0 +1,25 @@ +package com.cowr.local.ssjygl.order.ordertransfer; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; + +public class OrderTransferPayValidator extends CrudParamValidator { + + @Override + protected void validate(Controller c) { + validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); + validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); + validateInteger("sandfarm_id", 1, 2147483647, "sandfarm_id", "sandfarm_id 范围 1~2147483647"); + validateInteger("product_id", 1, 2147483647, "product_id", "product_id 范围 1~2147483647"); + + if(StrKit.notBlank(c.get("source_weight"))){ + validateDouble("source_weight", 1, 9999, "source_weight", "source_weight 范围 1~999"); + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java new file mode 100644 index 0000000..69ac8ee --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertransfer/OrderTransferSyncService.java @@ -0,0 +1,254 @@ +package com.cowr.local.ssjygl.order.ordertransfer; + +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.order.orderseq.OrderSeqService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.*; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistanceService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.Date; + +public class OrderTransferSyncService { + public static OrderTransferSyncService me = new OrderTransferSyncService(); + private static Log log = Log.getLog(OrderTransferSyncService.class); + + /** + * + * @param uuid 避免重复提交 + * @param transport_id 运输记录id + * @param sandfarm_id 采砂点id + * @param product_id 品类id + * @param printerId 打印机id + * @param source_weight 底单重量 + * @param sysuser 用户 + * @return + */ + public Result pay( + String uuid, + String transport_id, + Integer sandfarm_id, + Integer product_id, + String printerId, + Double source_weight, + Sysuser sysuser + ) { + Transport transport = Transport.dao.findById(transport_id); + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + + if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("进出场记录已完结或者已作废,不能使用"); + } + + Product product = Product.dao.findById(product_id); + if (product == null) { + return Result.failedstr("没有找到商品信息【%s】", product_id); + } + + Sandfarm sandfarm = Sandfarm.dao.findById(sandfarm_id); + if (sandfarm == null) { + return Result.failedstr("没有找到砂场信息【%s】", sandfarm_id); + } + + Truck truck = Truck.dao.findById(transport.getTruckLicense()); + if (truck == null) { + return Result.failedstr("不是物流公司车辆【%s】", transport.getTruckLicense()); + } + + TransportCompany tc = TransportCompany.dao.findById(truck.getTransCoId()); + if (tc == null) { + return Result.failedstr("车辆【%s】关联物流公司信息错误", transport.getTruckLicense()); + } + + BigDecimal min = new BigDecimal(0.001); + Date now = new Date(); + SyncTask synctask = new SyncTask(); + OrderTransfer order = new OrderTransfer(); + order.setUuid(uuid); + + if (order.checkDuplicate("uuid")) { + return Result.failed("【%s】已经存在", uuid); + } + + // 验证重量 + 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 net_weight = transport.getFirstWeight().subtract(transport.getSecondWeight()); // 转运的用第一次减第二次 + + if(source_weight != null){ + order.setSourceWeight(new BigDecimal(source_weight)); + } + + order.setTransportId(transport.getId()); + order.setSupermarketId(transport.getSupermarketId()); + order.setTruckLicense(transport.getTruckLicense()); + order.setProductId(product.getId()); + order.setProductName(product.getName()); + order.setSandfarmId(sandfarm_id); + order.setWeight(net_weight); // 使用净重更新重量 + + order.setCreateUserId(sysuser.getId()); + order.setCreateUserName(sysuser.getName()); + order.setSettlementUserId(sysuser.getId()); + order.setSettlementUserName(sysuser.getName()); + + order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 + order.setCreateTime(now); + + // 物流公司信息 + order.setTransCoId(truck.getTransCoId()); + order.setTransCoAddress(tc.getAddress()); + order.setTransCoBankAccount(tc.getBankAccount()); + order.setTransCoBankName(tc.getBankName()); + order.setTransCoName(tc.getName()); + order.setTransCoPhone(tc.getPhone()); + order.setTransCoTexpayerName(tc.getTexpayerName()); + order.setTransCoTexpayerNum(tc.getTexpayerNum()); + + order.setTransDistance(SupermarketSandfarmDistanceService.me.getDistance(transport.getSupermarketId(), sandfarm_id)); + order.setTransUnitPrice(new BigDecimal(TransPriceService.me.getTransferStartTransPrice(order.getTransDistance().doubleValue()))); + // 支付时,用净重计算运费 + order.setTransPrice(new BigDecimal(TransPriceService.me.caleTransferTransPrice(order.getTransCoId(), net_weight.doubleValue(), order.getTransDistance().doubleValue()))); + + // 更新 transport 出入场信息 + transport.setTransCoId(truck.getTransCoId()); + transport.setTransCoAddress(tc.getAddress()); + transport.setTransCoBankAccount(tc.getBankAccount()); + transport.setTransCoBankName(tc.getBankName()); + transport.setTransCoName(tc.getName()); + transport.setTransCoPhone(tc.getPhone()); + transport.setTransCoTexpayerName(tc.getTexpayerName()); + transport.setTransCoTexpayerNum(tc.getTexpayerNum()); + transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 + transport.setArriveTime(now); + transport.setType(OrderTypeEnum.TRANSFER.getTypeid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + order.setSn(OrderSeqService.me.getNextSn(transport.getSupermarketId(), OrderTypeEnum.TRANSFER.getTypeid())); + transport.setOrderSn(order.getSn()); + + boolean ret = order.save(); + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), product_id); + if (stock == null) { + log.error("未找到库存信息 %s, %s", order.getSupermarketId(), order.getProductId()); + return false; + } + + stock.setStockWeight(stock.getStockWeight().add(net_weight)); // 转运加库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + ret = transport.update(); + + if (!ret) { + return false; + } + + // 在这里更新sn字段之后存入 + synctask.addSaveData(order); + synctask.addUpdateData(transport); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + } + + public Result cancel(String sn, Sysuser sysuser, String password) { + // TODO: 判断权限 + + OrderTransfer order = OrderTransfer.dao.findById(sn); + + if (order == null) { + return Result.failedstr("按订单号【%s】未找到记录", sn); + } + + int orderstate = order.getState(); + + // 订单已经完成 + if (orderstate == OrderStateEnum.RECEIVED.getStateid()) { + // 已完成订单,再删除时需要重新验证密码 + Sysuser chkuser = SysuserService.me.getUserByWhere(null, sysuser.getPhone(), password); + + if (chkuser == null) { + log.debug("用户输入密码错误"); + return Result.permissionDenied(); + } + } + + if (orderstate == OrderStateEnum.INVALID.getStateid()) { + return Result.failed("订单已经取消"); + } + + order.setState(OrderStateEnum.INVALID.getStateid()); // 将订单状态置为 9 + + Record logrecord = new Record(); + logrecord.set("sn", sn); + logrecord.set("state", OrderStateEnum.INVALID.getStateid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + 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().subtract(order.getWeight())); // 取消转运减库存 + + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(order); + synctask.addUpdateData(stock); + + return order.update() && stock.update() + && 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); + return false; + } + } + }); + + return ret ? Result.success(order) : Result.failed("取消失败"); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashController.java new file mode 100644 index 0000000..bfbeaec --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashController.java @@ -0,0 +1,96 @@ +package com.cowr.local.ssjygl.order.ordertrash; + +import com.cowr.common.base.BaseController; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.order.OrderCancelValidator; +import com.cowr.ssjygl.order.SnValidator; +import com.cowr.ssjygl.order.ordertrash.OrderTrashPKValidator; +import com.cowr.ssjygl.order.ordertrash.OrderTrashService; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +public class OrderTrashController extends BaseController { + private static Log log = Log.getLog(OrderTrashController.class); + + @Before(OrderTrashPKValidator.class) + public void get(){ + renderJson(Result.object(OrderTrashService.me.get(get("sn")))); + } + + /** + * 分页查找 order_trash 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + + renderJson(Result.object(OrderTrashService.me.find(pp, sn, truck_license, supermarket_id, stm, etm, product_id, state))); + } + + @Before(OrderTrashPayValidator.class) + public void pay() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String uuid = get("uuid"); + String transport_id = get("transport_id"); + Double trans_distance = getParaToDouble("trans_distance"); + Integer product_id = getInt("product_id"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + renderJson(OrderTrashSyncService.me.pay(uuid, transport_id, trans_distance, product_id, printer, tokenuser)); + } + + /** + * 订单取消 + */ + @Before(OrderCancelValidator.class) + public void cancel() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String password = get("password"); + + renderJson(OrderTrashSyncService.me.cancel(sn, tokenuser, password)); + } + + @Before(SnValidator.class) + public void print() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String sn = get("sn"); + String printer = get("printer", Enums.PrinterIdEnum.printer1.name()); + + if (Integer.parseInt(sn.substring(10, 12)) != OrderTypeEnum.TRASH.getTypeid()) { + renderJson(Result.failed("sn 不能为 null")); + }else{ + renderJson(OrderService.me.print(sn, printer, tokenuser)); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashPayValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashPayValidator.java new file mode 100644 index 0000000..4c11046 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashPayValidator.java @@ -0,0 +1,20 @@ +package com.cowr.local.ssjygl.order.ordertrash; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class OrderTrashPayValidator extends CrudParamValidator { + + @Override + protected void validate(Controller c) { + validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); + validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); + validateDouble("trans_distance", 1, 2147483647, "trans_distance", "trans_distance 范围 1~2147483647"); + validateInteger("product_id", 1, 2147483647, "product_id", "product_id 范围 1~2147483647"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashSyncService.java new file mode 100644 index 0000000..a3e6d6c --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/order/ordertrash/OrderTrashSyncService.java @@ -0,0 +1,232 @@ +package com.cowr.local.ssjygl.order.ordertrash; + +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.order.orderseq.OrderSeqService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.*; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.Date; + +public class OrderTrashSyncService { + public static OrderTrashSyncService me = new OrderTrashSyncService(); + private static Log log = Log.getLog(OrderTrashSyncService.class); + + public Result pay( + String uuid, + String transport_id, + Double trans_distance, + Integer product_id, + String printerId, + Sysuser sysuser + ) { + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + + if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("进出场记录已完结或者已作废,不能使用"); + } + + Product product = Product.dao.findById(product_id); + + if (product == null) { + return Result.failedstr("没有找到商品信息【%s】", product_id); + } + + Truck truck = Truck.dao.findById(transport.getTruckLicense()); + + if (truck == null) { + return Result.failedstr("不是物流公司车辆【%s】", transport.getTruckLicense()); + } + + TransportCompany tc = TransportCompany.dao.findById(truck.getTransCoId()); + + if (tc == null) { + return Result.failedstr("车辆【%s】关联物流公司信息错误", transport.getTruckLicense()); + } + + BigDecimal min = new BigDecimal(0.001); + Date now = new Date(); + Record syncdata = new Record(); + SyncTask synctask = new SyncTask(); + OrderTrash order = new OrderTrash(); + order.setUuid(uuid); + + if (order.checkDuplicate("uuid")) { + return Result.failed("【%s】已经存在", uuid); + } + + // 验证重量 + 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 net_weight = transport.getFirstWeight().subtract(transport.getSecondWeight()); // 转运的用第一次减第二次 + + order.setTransportId(transport.getId()); + order.setSupermarketId(transport.getSupermarketId()); + order.setTruckLicense(transport.getTruckLicense()); + order.setProductId(product.getId()); + order.setProductName(product.getName()); + order.setWeight(net_weight); // 使用净重更新重量 + + order.setCreateUserId(sysuser.getId()); + order.setCreateUserName(sysuser.getName()); + order.setSettlementUserId(sysuser.getId()); + order.setSettlementUserName(sysuser.getName()); + + order.setState(OrderStateEnum.RECEIVED.getStateid()); // 直接完成,没有前面的过程 + order.setCreateTime(now); + + // 物流公司信息 + order.setTransCoId(truck.getTransCoId()); + order.setTransCoAddress(tc.getAddress()); + order.setTransCoBankAccount(tc.getBankAccount()); + order.setTransCoBankName(tc.getBankName()); + order.setTransCoName(tc.getName()); + order.setTransCoPhone(tc.getPhone()); + order.setTransCoTexpayerName(tc.getTexpayerName()); + order.setTransCoTexpayerNum(tc.getTexpayerNum()); + + order.setTransDistance(new BigDecimal(trans_distance)); + order.setTransUnitPrice(new BigDecimal(TransPriceService.me.getTransferStartTransPrice(order.getTransDistance().doubleValue()))); + // 支付时,用净重计算运费 + order.setTransPrice(new BigDecimal(TransPriceService.me.caleTransferTransPrice(order.getTransCoId(), net_weight.doubleValue(), order.getTransDistance().doubleValue()))); + + // 更新 transport 出入场信息 + transport.setTransCoId(truck.getTransCoId()); + transport.setTransCoAddress(tc.getAddress()); + transport.setTransCoBankAccount(tc.getBankAccount()); + transport.setTransCoBankName(tc.getBankName()); + transport.setTransCoName(tc.getName()); + transport.setTransCoPhone(tc.getPhone()); + transport.setTransCoTexpayerName(tc.getTexpayerName()); + transport.setTransCoTexpayerNum(tc.getTexpayerNum()); + transport.setState(OrderStateEnum.RECEIVED.getStateid()); // 标记 transport state 为 5 ,表示出入场记录完成 + transport.setArriveTime(now); + transport.setType(OrderTypeEnum.TRASH.getTypeid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + order.setSn(OrderSeqService.me.getNextSn(transport.getSupermarketId(), OrderTypeEnum.TRASH.getTypeid())); + transport.setOrderSn(order.getSn()); + + boolean ret = order.save() && transport.update(); + + if (!ret) { + return false; + } + + Stock stock = Stock.dao.findByIds(transport.getSupermarketId(), product_id); + if (stock == null) { + log.error("未找到库存信息 %s, %s", transport.getSupermarketId(), product_id); + return false; + } + + stock.setStockWeight(stock.getStockWeight().subtract(net_weight)); // 废料运出,减库存 + ret = stock.update(); + + if (!ret) { + return false; + } + + // 在这里更新sn字段之后存入 + synctask.addSaveData(order); + synctask.addUpdateData(transport); + synctask.addUpdateData(stock); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return OrderService.me.orderPayComplete(ret, order.toRecord(), transport, printerId); + } + + public Result cancel(String sn, Sysuser sysuser, String password) { + // TODO: 判断权限 + + OrderTrash order = OrderTrash.dao.findById(sn); + + if (order == null) { + return Result.failedstr("按订单号【%s】未找到记录", sn); + } + + int orderstate = order.getState(); + + // 订单已经完成 + if (orderstate == OrderStateEnum.RECEIVED.getStateid()) { + // 已完成订单,再删除时需要重新验证密码 + Sysuser chkuser = SysuserService.me.getUserByWhere(null, sysuser.getPhone(), password); + + if (chkuser == null) { + log.debug("用户输入密码错误"); + return Result.permissionDenied(); + } + } + + if (orderstate == OrderStateEnum.INVALID.getStateid()) { + return Result.failed("订单已经取消"); + } + + order.setState(OrderStateEnum.INVALID.getStateid()); // 将订单状态置为 9 + + Record logrecord = new Record(); + logrecord.set("sn", sn); + logrecord.set("state", OrderStateEnum.INVALID.getStateid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + 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())); // 废料运出取消,加库存 + + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(order); + synctask.addUpdateData(stock); + + boolean ret = order.update() && stock.update() + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(order.tablename, "sn", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser); + + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.success(order) : Result.failed("取消失败"); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaydetail/PrepayDetailController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaydetail/PrepayDetailController.java new file mode 100644 index 0000000..b0ce77a --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaydetail/PrepayDetailController.java @@ -0,0 +1,82 @@ +package com.cowr.local.ssjygl.prepay.prepaydetail; + +import com.cowr.common.validator.CustomerIdValidator; +import com.cowr.common.validator.StartAndEndTimeValidator; +import com.cowr.common.view.ExcelRender; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.PrepayDetail; +import com.cowr.ssjygl.prepay.prepaydetail.PrepayDetailPKValidator; +import com.cowr.ssjygl.prepay.prepaydetail.PrepayDetailService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; +import org.apache.poi.ss.usermodel.Workbook; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: prepay_detail + * Remarks: 客户相关 - 客户预付费 + * PrimaryKey: id + */ +public class PrepayDetailController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(PrepayDetailPKValidator.class) + public void checkExistsByPk(){ + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 prepay_detail 客户相关 - 客户预付费 + */ + public void find(){ + String name = get("name"); + String stm = get("stm"); + String etm = get("etm"); + Integer state = getInt("state"); + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(PrepayDetailService.me.find(pp, name, stm, etm, state))); + } + + /** + * 按主键查找单个对象 prepay_detail 客户相关 - 客户预付费 + */ + @Before(PrepayDetailPKValidator.class) + public void findByPk(){ + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 prepay_detail 客户相关 - 客户预付费 + */ + @Before(PrepayDetailPKValidator.class) + public void get(){ + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailService.me.findByPk(model)); + } + + /** + * 返回所有 prepay_detail 预付费客户付费详情 + */ + @Before({StartAndEndTimeValidator.class, CustomerIdValidator.class}) + public void list(){ + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + int customer_id = getInt("customer_id", 0); + String stm = get("stm"); + String etm = get("etm"); + + if (export == 0) { + renderJson(Result.object(PrepayDetailService.me.list(customer_id, stm, etm))); + } else { + Workbook wb = PrepayDetailService.me.listExport(customer_id, stm, etm); + render(new ExcelRender("客户流水_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/DayValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/DayValidator.java new file mode 100644 index 0000000..afb0854 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/DayValidator.java @@ -0,0 +1,22 @@ +package com.cowr.local.ssjygl.prepay.prepaytruck; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; + +/** + * Generated by COWR Thu Jun 27 17:01:16 CST 2019 + */ +public class DayValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + if(StrKit.notBlank(c.get("valid_date"))){ + validateDate("valid_date", "yyyy-MM-dd","valid_date","valid_date 格式必须为 yyyy-MM-dd"); + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckController.java new file mode 100644 index 0000000..13c8365 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckController.java @@ -0,0 +1,156 @@ +package com.cowr.local.ssjygl.prepay.prepaytruck; + +import com.alibaba.fastjson.JSONArray; +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.PrepayTruck; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.prepay.prepaytruck.PrepayTruckPKValidator; +import com.cowr.ssjygl.prepay.prepaytruck.PrepayTruckService; +import com.cowr.ssjygl.prepay.prepaytruck.PrepayTruckValidator; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +/** + * Generated by COWR Sun Feb 23 21:22:12 CST 2020 + * TableName: prepay_truck + * Remarks: 每日超市指定预付费车辆 + * PrimaryKey: id + */ +public class PrepayTruckController extends BaseController { + private static Log log = Log.getLog(PrepayTruckController.class); + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(PrepayTruckPKValidator.class) + public void checkExistsByPk() { + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckService.me.checkExistsByPk(model)); + } + + /** + * 新增 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckValidator.class) + public void save() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + + try { + String trucks = get("trucks"); + JSONArray truckarr = JSONArray.parseArray(trucks); + + if (truckarr == null) { + renderJson(Result.failed("trucks 参数格式错误")); + } else { + renderJson(PrepayTruckSyncService.me.save(truckarr, tokenuser)); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + renderJson(Result.failed("参数解析格式不正确")); + } + } + + /** + * 删除 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckPKValidator.class) + public void del() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckPKValidator.class) + public void restore() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckValidator.class) + public void edit() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 prepay_truck 每日超市指定预付费车辆 + */ + @Before(DayValidator.class) + public void find() { + Integer customer_id = getInt("customer_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer trans_co_id = getInt("trans_co_id"); + String truck_license = getUpperCaseVal("truck_license"); + String valid_date = get("valid_date"); + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(PrepayTruckService.me.find(pp, customer_id, supermarket_id, trans_co_id, truck_license, valid_date))); + } + + /** + * 按主键查找单个对象 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckPKValidator.class) + public void findByPk() { + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckPKValidator.class) + public void get() { + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckService.me.findByPk(model)); + } + + /** + * 返回所有 prepay_truck 每日超市指定预付费车辆 + */ + public void list() { + Integer customer_id = getInt("customer_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer trans_co_id = getInt("trans_co_id"); + String truck_license = getUpperCaseVal("truck_license"); + String valid_date = get("valid_date"); + renderJson(Result.object(PrepayTruckService.me.list(customer_id, supermarket_id, trans_co_id, truck_license, valid_date))); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckSyncService.java new file mode 100644 index 0000000..fa02760 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckSyncService.java @@ -0,0 +1,134 @@ +package com.cowr.local.ssjygl.prepay.prepaytruck; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.base.BaseSyncService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.model.*; +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 com.jfinal.plugin.activerecord.Record; + +import java.sql.SQLException; +import java.util.*; + +public class PrepayTruckSyncService extends BaseSyncService { + public static PrepayTruckSyncService me = new PrepayTruckSyncService(); + private static Log log = Log.getLog(PrepayTruckSyncService.class); + + /** + * + * @param truckarr + * [ + * { + * customer_id + * truck_license + * supermarket_id + * valid_date + * type + * } + * ] + * @param sysuser + * @return + */ + public Result save(JSONArray truckarr, Sysuser sysuser) { + try { + if(truckarr == null){ + return Result.failed("无效的参数"); + } + + List ts = new ArrayList<>(); + List tsql = new ArrayList<>(); + + Map co_trucks = new HashMap<>(); // 物流公司车辆 + List co_tsql = new ArrayList<>(); + + List pts = new ArrayList<>(); + + for (int i = 0; i < truckarr.size(); i++) { + JSONObject obj = truckarr.getJSONObject(i); + + ts.add(obj.getString("truck_license")); + tsql.add("?"); + + if(obj.getIntValue("type") == 1){ + co_trucks.put(obj.getString("truck_license"), true); + co_tsql.add("?"); + } + } + + List list = Blacklist.dao.find( + "select * from blacklist \n" + + " where remove_user_id is null \n" + + " and truck_license in (" + StrKit.join(tsql, ",") + ")", ts.toArray()); + + if (list != null && !list.isEmpty()) { + ts = new ArrayList<>(); + + for (Blacklist bl : list) { + ts.add(bl.getTruckLicense()); + } + + return Result.failed(StrKit.join(ts, ",") + " 车牌号在黑名单中"); + } + + if(!co_trucks.isEmpty()){ + List trucks = Truck.dao.find( + "select * from truck where license in (" + + StrKit.join(co_tsql, ",") + ")", co_trucks.keySet().toArray()); + + if (trucks != null && !trucks.isEmpty()) { + for (Truck bl : trucks) { + co_trucks.remove(bl.getLicense()); + } + + ts = new ArrayList<>(); + + for (String s : co_trucks.keySet()) { + ts.add(s); + } + } + + if(!co_trucks.isEmpty()){ + return Result.failed(StrKit.join(ts, ",") + " 车牌不是物流公司车辆"); + } + } + + for (int i = 0; i < truckarr.size(); i++) { + JSONObject obj = truckarr.getJSONObject(i); + Record record = new Record().setColumns(obj.getInnerMap()); + record.set("create_user_id", sysuser.getId()); + pts.add(record); + } + + if (pts.isEmpty()) { + return Result.failed("truck_license 参数错误"); + } + + // TODO: 这里要不要加入同步,上传到服务端。预付费车辆只再本超市使用 + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + int[] ret = Db.batchSave(PrepayTruck.tablename, pts, pts.size()); + + return ret.length == pts.size(); + } + }); + + return ret ? Result.success() : Result.failed(false, "新增失败"); + } catch (Exception e) { + if (e.getMessage().contains("prepay_truck_license_customer")) { + return Result.failed("同一辆车同一天只能分配一次"); + } + + log.error(e.getMessage(), e); + return Result.failed(false, e.getMessage()); + } + } + +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java new file mode 100644 index 0000000..00185d7 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/prepaytruck/PrepayTruckValidator.java @@ -0,0 +1,37 @@ +package com.cowr.local.ssjygl.prepay.prepaytruck; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.PrepayTruck; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Feb 23 21:22:13 CST 2020 + * TableName: prepay_truck + * Remarks: 每日超市指定预付费车辆 + * PrimaryKey: id + */ +public class PrepayTruckValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + // 默认新增时,前端不需要传主键。若需要前端传主键,需要去掉这个判断 + if (!"save".equals(getActionMethodName())) { + validateRequired("id", "id", "id 必填"); + + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + } + + validateRequired("trucks", "trucks", "trucks 必填"); + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/refunddetail/RefundDetailController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/refunddetail/RefundDetailController.java new file mode 100644 index 0000000..17d3a07 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/prepay/refunddetail/RefundDetailController.java @@ -0,0 +1,67 @@ +package com.cowr.local.ssjygl.prepay.refunddetail; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.RefundDetail; +import com.cowr.ssjygl.prepay.refunddetail.RefundDetailPKValidator; +import com.cowr.ssjygl.prepay.refunddetail.RefundDetailService; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Mon Feb 10 12:11:02 CST 2020 + * TableName: refund_detail + * Remarks: 预付费客户退费详情 + * PrimaryKey: id + */ +public class RefundDetailController extends BaseController { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(RefundDetailPKValidator.class) + public void checkExistsByPk(){ + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 refund_detail 预付费客户退费详情 + */ + public void find(){ + String name = get("name"); + String stm = get("stm"); + String etm = get("etm"); + Integer state = getInt("state"); + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(RefundDetailService.me.find(pp, name, stm, etm, state))); + } + + /** + * 按主键查找单个对象 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailPKValidator.class) + public void findByPk(){ + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailPKValidator.class) + public void get(){ + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailService.me.findByPk(model)); + } + + /** + * 返回所有 refund_detail 预付费客户退费详情 + */ + public void list(){ + renderJson(Result.object(RefundDetailService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/product/ProductController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/product/ProductController.java new file mode 100644 index 0000000..d5e14de --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/product/ProductController.java @@ -0,0 +1,65 @@ +package com.cowr.local.ssjygl.product; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Product; +import com.cowr.ssjygl.product.ProductPKValidator; +import com.cowr.ssjygl.product.ProductService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: product + * Remarks: 商品信息 + * PrimaryKey: id + */ +public class ProductController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(ProductPKValidator.class) + public void checkExistsByPk(){ + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 product 商品信息 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(ProductService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 product 商品信息 + */ + @Before(ProductPKValidator.class) + public void findByPk(){ + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 product 商品信息 + */ + @Before(ProductPKValidator.class) + public void get(){ + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductService.me.findByPk(model)); + } + + /** + * 返回所有 product 商品信息 + */ + public void list(){ + renderJson(Result.object(ProductService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/purchase/PurchaseController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/purchase/PurchaseController.java new file mode 100644 index 0000000..52b8675 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/purchase/PurchaseController.java @@ -0,0 +1,65 @@ +package com.cowr.local.ssjygl.purchase; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Purchase; +import com.cowr.ssjygl.purchase.PurchasePKValidator; +import com.cowr.ssjygl.purchase.PurchaseService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: purchase + * Remarks: 采购点(采砂场) + * PrimaryKey: id + */ +public class PurchaseController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(PurchasePKValidator.class) + public void checkExistsByPk(){ + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 purchase 采购点(采砂场) + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(PurchaseService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 purchase 采购点(采砂场) + */ + @Before(PurchasePKValidator.class) + public void findByPk(){ + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 purchase 采购点(采砂场) + */ + @Before(PurchasePKValidator.class) + public void get(){ + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseService.me.findByPk(model)); + } + + /** + * 返回所有 purchase 采购点(采砂场) + */ + public void list(){ + renderJson(Result.object(PurchaseService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/sandfarm/SandfarmController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/sandfarm/SandfarmController.java new file mode 100644 index 0000000..c79c852 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/sandfarm/SandfarmController.java @@ -0,0 +1,65 @@ +package com.cowr.local.ssjygl.sandfarm; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Sandfarm; +import com.cowr.ssjygl.sandfarm.SandfarmPKValidator; +import com.cowr.ssjygl.sandfarm.SandfarmService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: sandfarm + * Remarks: 生产点(采砂场) + * PrimaryKey: id + */ +public class SandfarmController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SandfarmPKValidator.class) + public void checkExistsByPk(){ + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 sandfarm 生产点(采砂场) + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(SandfarmService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 sandfarm 生产点(采砂场) + */ + @Before(SandfarmPKValidator.class) + public void findByPk(){ + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 sandfarm 生产点(采砂场) + */ + @Before(SandfarmPKValidator.class) + public void get(){ + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmService.me.findByPk(model)); + } + + /** + * 返回所有 sandfarm 生产点(采砂场) + */ + public void list(){ + renderJson(Result.object(SandfarmService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/SupermarketController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/SupermarketController.java new file mode 100644 index 0000000..df00a3b --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/SupermarketController.java @@ -0,0 +1,64 @@ +package com.cowr.local.ssjygl.supermarket; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Supermarket; +import com.cowr.ssjygl.supermarket.SupermarketPKValidator; +import com.cowr.ssjygl.supermarket.SupermarketService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: supermarket + * Remarks: 销售点(超市) + * PrimaryKey: id + */ +public class SupermarketController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SupermarketPKValidator.class) + public void checkExistsByPk(){ + Supermarket model = getModel(Supermarket.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 supermarket 销售点(超市) + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(SupermarketService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 supermarket 销售点(超市) + */ + @Before(SupermarketPKValidator.class) + public void findByPk(){ + Supermarket model = getModel(Supermarket.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 supermarket 销售点(超市) + */ + @Before(SupermarketPKValidator.class) + public void get(){ + renderJson(SupermarketService.me.get(getInt("id"))); + } + + /** + * 返回所有 supermarket 销售点(超市) + */ + public void list(){ + renderJson(Result.object(SupermarketService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/product/SupermarketProductService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/product/SupermarketProductService.java new file mode 100644 index 0000000..c6bbc38 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/product/SupermarketProductService.java @@ -0,0 +1,56 @@ +package com.cowr.local.ssjygl.supermarket.product; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseService; +import com.cowr.common.view.PageParam; +import com.cowr.model.SupermarketProduct; +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri Apr 17 16:59:39 CST 2020 + * TableName: supermarket_product + * Remarks: 基础配置 - 超市关联 product 表 + * PrimaryKey: supermarket_id,product_id + */ +public class SupermarketProductService extends BaseService { + public static final SupermarketProductService me = new SupermarketProductService(); + + public BigDecimal getUnitPrice(int supermarket_id, int product_id) { + SupermarketProduct sp = SupermarketProduct.dao.findByIds(supermarket_id, product_id); + + return null == sp ? null : sp.getUnitPrice(); + } + + public Page find(PageParam pp) { + String selectsql = "select * "; + String fromsql = "from supermarket_product t where 1=1 "; + List paraList = new ArrayList<>(); + + String totalRowSql = "select count(*) " + fromsql; + String findSql = selectsql + fromsql; + + // 前端传了排序字段,并且排序字段存在相关表中 + if (StrKit.notBlank(pp.getSort_field()) && SupermarketProduct.dao.hasColunm(pp.getSort_field())) { + findSql += " order by t." + pp.getSort_field() + " is null, t." + pp.getSort_field(); + + if (Const.ORDER_BY_ASC.equals(pp.getSort_order())) { + findSql += " " + Const.ORDER_BY_ASC; + } else { + findSql += " " + Const.ORDER_BY_DESC; + } + } + + return Db.paginateByFullSql(pp.getPage(), pp.getSize(), totalRowSql, findSql, paraList.toArray()); + } + + public List list() { + return SupermarketProduct.dao.find("select * from supermarket_product"); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java new file mode 100644 index 0000000..d1044aa --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java @@ -0,0 +1,79 @@ +package com.cowr.local.ssjygl.supermarket.receiverdistance; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.SupermarketReceiverDistance; +import com.cowr.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistancePKValidator; +import com.cowr.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistanceService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; +import com.jfinal.plugin.activerecord.Db; + +import java.math.BigDecimal; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: supermarket_receiver_distance + * Remarks: 客户收获地址到每个超市的距离 + * PrimaryKey: supermarket_id,customer_receiver_id + */ +public class SupermarketReceiverDistanceController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void checkExistsByPk(){ + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_receiver_id = getInt("customer_receiver_id"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(SupermarketReceiverDistanceService.me.find(pp, supermarket_id, customer_receiver_id, customer_id))); + } + + /** + * 按主键查找单个对象 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void findByPk(){ + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void get(){ + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceService.me.findByPk(model)); + } + + /** + * 返回所有 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + public void list(){ + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_receiver_id = getInt("customer_receiver_id"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(SupermarketReceiverDistanceService.me.list(supermarket_id, customer_receiver_id, customer_id))); + } + + public void findAllSupermarket(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer customer_receiver_id = getInt("customer_receiver_id"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(SupermarketReceiverDistanceService.me.findAllSupermarket(pp, customer_receiver_id, customer_id))); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java new file mode 100644 index 0000000..d6a2a16 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java @@ -0,0 +1,66 @@ +package com.cowr.local.ssjygl.supermarket.sandfarmdistance; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.SupermarketSandfarmDistance; +import com.cowr.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistancePKValidator; +import com.cowr.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistanceService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: supermarket_sandfarm_distance + * Remarks: 生产点到销售点的距离配置 + + * PrimaryKey: supermarket_id,sandfarm_id + */ +public class SupermarketSandfarmDistanceController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void checkExistsByPk(){ + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer supermarket_id = getInt("supermarket_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + renderJson(Result.object(SupermarketSandfarmDistanceService.me.find(pp, supermarket_id, sandfarm_id))); + } + + /** + * 按主键查找单个对象 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void findByPk(){ + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void get(){ + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.findByPk(model)); + } + + /** + * 返回所有 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + public void list(){ + renderJson(Result.object(SupermarketSandfarmDistanceService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockController.java new file mode 100644 index 0000000..7740694 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockController.java @@ -0,0 +1,53 @@ +package com.cowr.local.ssjygl.supermarket.stock; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Stock; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.supermarket.stock.StockService; +import com.cowr.ssjygl.supermarket.stock.StockValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:38 CST 2020 + * TableName: stock + * Remarks: 订单相关 - 销售点库存量 + * PrimaryKey: supermarket_id + */ +public class StockController extends Controller { + + /** + * 修改 stock 订单相关 - 销售点库存量 + */ + @Before(StockValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Stock model = getModel(Stock.class, "", true); // 忽略不在model中的字段 + renderJson(StockSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 stock 订单相关 - 销售点库存量 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + renderJson(Result.object(StockService.me.find(pp, supermarket_id, product_id))); + } + + /** + * 返回所有 stock 订单相关 - 销售点库存量 + */ + public void list(){ + renderJson(Result.object(StockService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockSyncService.java new file mode 100644 index 0000000..29ae8e4 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/supermarket/stock/StockSyncService.java @@ -0,0 +1,131 @@ +package com.cowr.local.ssjygl.supermarket.stock; + +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.model.*; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class StockSyncService { + private static Log log = Log.getLog(StockSyncService.class); + public static StockSyncService me = new StockSyncService(); + + /** + * 找到无库存信息的砂场,插入库存数据 + * TODO 这里应该是初始化时,从服务端拉取? + */ + public void initSupermarketStock() { + List list = Db.find("select t.*, p.product_id, s.supermarket_id from supermarket t \n" + + " left join stock s on t.id = s.supermarket_id \n" + + " left join supermarket_product p on p.supermarket_id = t.id\n" + + " where s.supermarket_id is null"); + + if (list == null || list.isEmpty()) { + log.debug("所有砂场库存信息已初始化"); + return; + } + + List newlist = new ArrayList<>(); + SyncTask synctask = new SyncTask(); + + for (Record record : list) { + if(record.get("id") == CliCacheData.SUP.getId()){ + Stock stock = new Stock(); + stock.setProductId(record.get("product_id")); + stock.setSupermarketId(record.get("id")); + stock.setStockWeight(new BigDecimal(0)); + + newlist.add(stock); + + synctask.addSaveData(stock); + } + } + + if (!newlist.isEmpty()) { + Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + int[] ret = Db.batchSave(newlist, newlist.size()); + + return ret.length == newlist.size() && SyncTaskService.me.save(synctask); + } + }); + + log.debug("初始化砂场库存信息 "); + } + } + + /** + * 手动修改库存记录 + * + * @param model + * @param sysuser + * @return + */ + public Result update(Stock model, Sysuser sysuser) { + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if (supermarket == null) { + return Result.failed("超市信息获取失败"); + } + + Product product = Product.dao.findById(model.getProductId()); + + if (product == null) { + return Result.failed("商品信息获取失败"); + } + + Date now = new Date(); + + StockModifyLog modifyLog = new StockModifyLog(); + modifyLog.setSupermarketId(model.getSupermarketId()); + modifyLog.setProductId(model.getProductId()); + modifyLog.setCreateUserId(sysuser.getId()); + modifyLog.setCreateUserName(sysuser.getName()); + modifyLog.setChangeTime(now); + modifyLog.setNewStockWeight(model.getStockWeight()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = false; + SyncTask synctask = new SyncTask(); + + if (model.checkExistsByPk()) { // update + Stock oldstock = Stock.dao.findByIds(model.getSupermarketId(), model.getProductId()); + modifyLog.setOldStockWeight(oldstock.getStockWeight()); + + ret = model.update() && modifyLog.save(); + } else { + modifyLog.setOldStockWeight(new BigDecimal(0)); + ret = model.save() && modifyLog.save(); + } + + if(!ret){ + return false; + } + + synctask.addUpdateData(model); + synctask.addSaveData(modifyLog); + + return SyncTaskService.me.save(synctask); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.success(model) : Result.failed("修改失败"); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java new file mode 100644 index 0000000..a32af30 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/synctask/SyncTaskService.java @@ -0,0 +1,285 @@ +package com.cowr.local.ssjygl.synctask; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.cowr.common.enums.Enums; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.main.Config; +import com.cowr.model.AuthLicense; +import com.cowr.model.SyncTask; +import com.cowr.ssjygl.CacheData; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.sql.SQLException; +import java.util.*; + +public class SyncTaskService { + private static Log log = Log.getLog(SyncTaskService.class); + public static final SyncTaskService me = new SyncTaskService(); + + // 是否开启 + public boolean isEnable() { + return CacheData.service_enable; + } + + /** + * 创建同步日志,并且发送上报数据包 + * + * @param synctask 的 SyncTask + * @return + */ + public boolean save(SyncTask synctask) { + if(!isEnable()){ + return true; + } + + synctask.setJson(); // 使用逐步加入的数据设置数据 + + synctask.setId(StrKit.getRandomUUID()); + synctask.setSupermarketId(CliCacheData.SUP.getId()); + synctask.setCreateTime(new Date()); + + return synctask.save(); // 有插入的,还是需要返回插入状态 + } + + /** + * 向所有客户端广播 + * + * @param model + */ + public void send(SyncTask model) { + if(!isEnable()){ + return; + } + + JSONObject obj = new JSONObject() + .fluentPut("target", Enums.MsgTarget.SYNCTASK) + .fluentPut("data", model); + + Config.nettyClient.sendMsg(obj.toJSONString()); + } + + public void syncComplete(String id) { + // TODO 测试完成后,正式运行时,将已同步数据删除。或者将超过一定时间记录删除 + SyncTask synctask = SyncTask.dao.findById(id); + if (synctask != null) { + synctask.setState(1); + boolean ret = synctask.update(); + + if (!ret) { + log.error("synctask 状态更新失败, id: %s", id); + } + } + } + + public void task() { + if(!isEnable()){ + return; + } + + List list = unsynclist(); + + if (!list.isEmpty()) { + log.debug("开始下发未同步完成的数据"); + } + + // TODO:一次同步的数量不多,连续发送 + for (SyncTask obj : list) { + send(obj); + } + } + + public List unsynclist() { + return SyncTask.dao.find("select * from sync_task t where t.state = 0 order by t.create_time limit 0, 500"); + } + + /** + * 接收云端传递过来的数据,入库 + *

+ * 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了 + * + * @param data + * @return + */ + public boolean recv(JSONObject data) { + if(!isEnable()){ + return true; + } + + long st = System.currentTimeMillis(); + + try { + JSONObject save_data = JSONObject.parseObject(data.getString("save_data")); + JSONObject update_data = JSONObject.parseObject(data.getString("update_data")); + JSONObject delete_data = JSONObject.parseObject(data.getString("delete_data")); + + if ( + (save_data == null || save_data.isEmpty()) + && (update_data == null || update_data.isEmpty()) + && (delete_data == null || delete_data.isEmpty()) + ) { + log.error("同步的数据是空的 %s", data.toJSONString()); + log.debug("recv 1 time: %s", System.currentTimeMillis() - st); + return true; + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + JSONArray saveauthlics = new JSONArray(); // 授权车牌号需要推送更新到其他超市 + JSONArray deleteauthlics = new JSONArray(); + + if (save_data != null && !save_data.isEmpty()) { + for (String tablename : save_data.keySet()) { + JSONObject data = save_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray arr = data.getJSONArray("data"); + List list = new ArrayList<>(); + + if (AuthLicense.dao.getTablename().equals(tablename)) { + saveauthlics.addAll(arr); + continue; + } + + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = arr.getJSONObject(i); + + list.add(new Record().setColumns(obj.getInnerMap())); + } + + int[] ret = Db.batchSave(tablename, list, list.size()); + + if (ret.length != list.size()) { + return false; + } + } + } + + if (update_data != null && !update_data.isEmpty()) { + for (String tablename : update_data.keySet()) { + JSONObject data = update_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray arr = data.getJSONArray("data"); + List list = new ArrayList<>(); + + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = arr.getJSONObject(i); + + list.add(new Record().setColumns(obj.getInnerMap())); + } + + int[] ret = Db.batchUpdate(tablename, pks, list, list.size()); + + if (ret.length != list.size()) { + return false; + } + } + } + + if (delete_data != null && !delete_data.isEmpty()) { + for (String tablename : delete_data.keySet()) { + JSONObject data = delete_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray arr = data.getJSONArray("data"); + + if (AuthLicense.dao.getTablename().equals(tablename)) { + deleteauthlics.addAll(arr); + continue; + } + + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = arr.getJSONObject(i); + + boolean ret = Db.delete(tablename, pks, new Record().setColumns(obj.getInnerMap())); + + if (!ret) { + return false; + } + } + } + } + + if (!saveauthlics.isEmpty() && !deleteauthlics.isEmpty()) { + return recvAuthLicense(saveauthlics, deleteauthlics); + } + + return true; + } catch (Exception e) { + if (e.getMessage().contains("PRIMARY")) { + log.error("主键冲突 %s", data.toJSONString()); + } else if (e.getMessage().contains("Duplicate entry")) { + log.error("重复数据 %s", data.toJSONString()); + } else { + log.error(e.getMessage(), e); + } + + return false; + } + } + }); + + log.debug("recv 2 time: %s", System.currentTimeMillis() - st); + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + + log.debug("recv 3 time: %s", System.currentTimeMillis() - st); + return false; + } + } + + + + /** + * 将收到的 auth_license 转发到其他超市 + * + * @param savearr + * @param deletearr + * @return + */ + public boolean recvAuthLicense(JSONArray savearr, JSONArray deletearr) { + try { + Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + List saves = new ArrayList<>(); + + if (savearr != null && !savearr.isEmpty()) { + for (int i = 0; i < savearr.size(); i++) { + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(savearr.getJSONObject(i).getString("truck_license")); + + saves.add(authlic); + } + + try { + Db.batchSave(saves, saves.size()); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + if (deletearr != null && !deletearr.isEmpty()) { + for (int i = 0; i < deletearr.size(); i++) { + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(deletearr.getJSONObject(i).getString("truck_license")); + + authlic.delete(); + } + } + + return true; + } + }); + }catch (Exception e){ + log.error(e.getMessage(), e); + } + + return true; + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserController.java new file mode 100644 index 0000000..148ffb0 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserController.java @@ -0,0 +1,142 @@ +package com.cowr.local.ssjygl.system.sysuser; + +import com.cowr.common.Const; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.main.AuthInterceptor; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.system.sysuser.SysuserPKValidator; +import com.cowr.ssjygl.system.sysuser.SysuserValidator; +import com.jfinal.aop.Before; +import com.jfinal.aop.Clear; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Tue Jun 25 00:41:56 CST 2019 + * TableName: sysuser + * Remarks: + * PrimaryKey: id + */ +public class SysuserController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SysuserPKValidator.class) + public void checkExistsByPk(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.checkExistsByPk(model)); + } + + /** + * 新增 sysuser + */ + @Before(SysuserValidator.class) + public void save(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.save(model)); + } + + /** + * 删除 sysuser + */ + @Before(SysuserPKValidator.class) + public void del(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.delete(model)); + } + + /** + * 恢复 sysuser + */ + @Before(SysuserPKValidator.class) + public void restore(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.restore(model)); + } + + /** + * 修改 sysuser + */ + @Before(SysuserValidator.class) + public void edit(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.update(model)); + } + + /** + * 分页查找 sysuser + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name", ""); + String phone = get("phone", ""); + Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的 + Integer type = getInt("type"); + Integer entity_id = getInt("entity_id"); + renderJson(Result.object(SysuserService.me.find(pp, name, phone, del, type, entity_id))); + } + + /** + * 按主键查找单个对象 sysuser + */ + @Before(SysuserPKValidator.class) + public void findByPk(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.findByPk(model)); + } + + @Clear(AuthInterceptor.class) + public void login(){ + String name = get("name", "").trim(); + String phone = get("phone", "").trim(); + String password = get("password", ""); + + renderJson(SysuserService.me.login(name, phone, password)); + } + + /** + * 检查手机号是否已经存在 + */ + public void checkPhone(){ + String phone = get("phone", ""); + + // 先判断手机号是否符合格式要求,然后再判断数据库是否已经存在 + if(!StrUtil.isPhone(phone)){ + renderJson(Result.success(false)); + }else{ + renderJson(Result.success(SysuserService.me.checkPhone(phone))); + } + } + + /** + * 修改密码 + */ + public void modpwd(){ + String token = get("token", ""); + String oldpwd = get("oldpwd", ""); + String newpwd = get("newpwd", ""); + + renderJson(SysuserService.me.updatePassword(token, oldpwd, newpwd)); + } + + /** + * 按主键查找单个对象 sysuser + */ + @Before(SysuserPKValidator.class) + public void resetpwd(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.resetPassword(model, tokenuser)); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserService.java new file mode 100644 index 0000000..863fe45 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/system/sysuser/SysuserService.java @@ -0,0 +1,570 @@ +package com.cowr.local.ssjygl.system.sysuser; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseModel; +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.UserTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.main.Config; +import com.cowr.model.*; +import com.jfinal.kit.HashKit; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import com.jfinal.plugin.redis.Redis; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * Generated by COWR Tue Jun 25 00:41:56 CST 2019 + * TableName: sysuser + * Remarks: + * PrimaryKey: id + */ +public class SysuserService extends BaseService { + private static Log log = Log.getLog(SysuserService.class); + private static final String pwdkey = "sysuser"; + public static final String tablename = "sysuser"; + public static final SysuserService me = new SysuserService(); + private static final Pattern rolepattern = Pattern.compile("[0-2]{3}"); + // private static int expireAt = 24 * 60 * 60; // 超时时间,单位秒 + private static int expireAt = 24 * 60 * 60; // 超时时间,单位秒 + + public String redisbasekey() { + return Config.dbprop.get("redis.basekey") + Const.REDIS_SEPARATE + tablename + Const.REDIS_SEPARATE; + } + + public String tokenrediskey(String token) { + return redisbasekey() + "token" + Const.REDIS_SEPARATE + token; + } + + /** + * 是否是超市管理员 + * + * @param roleid + * @return + */ + public boolean isSuperAdmin(Integer roleid) { + if (roleid == null) return false; + String rolestr = roleid.toString(); + return rolepattern.matcher(rolestr).matches() && "1".equals(rolestr.substring(0, 1)) && "0".equals(rolestr.substring(2, 3)); + } + + /** + * 是否是超市管理调度 + * + * @param roleid + * @return + */ + public boolean isSuperCtrl(Integer roleid) { + if (roleid == null) return false; + String rolestr = roleid.toString(); + return rolepattern.matcher(rolestr).matches() && "1".equals(rolestr.substring(0, 1)) && "1".equals(rolestr.substring(2, 3)); + } + + /** + * 是否是超市装载员 + * + * @param roleid + * @return + */ + public boolean isSuperStevedore(Integer roleid) { + if (roleid == null) return false; + String rolestr = roleid.toString(); + return rolepattern.matcher(rolestr).matches() && "1".equals(rolestr.substring(0, 1)) && "2".equals(rolestr.substring(2, 3)); + } + + /** + * 2020-03-7 财务和总经理,必须选超市管理员? + * 是否是财务人员 + * + * @param roleid + * @return + */ + public boolean isTreasurer(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(501); + } + + /** + * 2020-03-7 财务和总经理,必须选超市管理员? + * 是否是财务人员 + * + * @param roleid + * @return + */ + public boolean isPresident(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(500); + } + + public boolean isPresidentView(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(502); + } + + /** + * 是否是物流公司管理员 + * + * @param roleid + * @return + */ + public boolean isTrancoAdmin(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(201); + } + + /** + * 是否是司机 + * + * @param roleid + * @return + */ + public boolean isTrancoDriver(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(202); + } + + public boolean isConfigAdmin(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(99); + } + + /** + * 生成token + * + * @param model + * @return + */ + public String getToken(Sysuser model) { + return StrKit.getRandomUUID(); + } + + /** + * 生成密码MD5 + * + * @param phone + * @param password + * @return 手机号已存在,返回 true,否则返回 false + */ + public String getPwdMD5(String phone, String password) { + return HashKit.md5(phone + password + pwdkey); + } + + public boolean checkPhone(String phone) { + try { + return Sysuser.dao.findFirst("select * from sysuser where phone = ?", phone) != null; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + private BaseModel checkEntityId(Sysuser model) { + if (model.getType() == null || !UserTypeEnum.hasTypeId(model.getType())) { + return null; + } + + if (model.getEntityId() != null) { + BaseModel baseModel = null; + + switch (UserTypeEnum.getUserType(model.getType())) { // 前面必须对 type 做必填、int验证,保障这里不报空指针 + case SUPERMARKET: + baseModel = Supermarket.dao.findById(model.getEntityId()); + break; + case TRANSCO: + baseModel = TransportCompany.dao.findById(model.getEntityId()); + break; + case CUSTOMER: + baseModel = Customer.dao.findById(model.getEntityId()); + break; + case DRIVER: + baseModel = Driver.dao.findById(model.getEntityId()); + break; + } + + return baseModel; + } + + return null; + } + + /** + * 已经做好相应的验证了 + * 多次使用的方法 + * 如果已经验证好了,不必要的验证就可以跳过了 + * + * @param model + * @return + */ + public boolean saveModel(Sysuser model) { + model.setPassword(getPwdMD5(model.getPhone(), Const.DEFAULT_PASSWORD)); + model.remove("id"); // 避免前端传 id + + return model.save(); + } + + /** + * 新增 + * 设置默认密码 + * + * @param model BaseModel + * @return Result + */ + public Result save(Sysuser model) { + try { + if (model.checkDuplicate("phone")) { + return Result.failed(false, "手机号已存在"); + } + + if (model.getType() == null || !UserTypeEnum.hasTypeId(model.getType())) { + return Result.failed(false, "type 必填"); + } + + if (model.getType() != null && UserTypeEnum.DRIVER.getTypeid().equals(model.getType())) { + return Result.failed(false, "不能直接在账号内添加司机"); + } + + if (!isTreasurer(model.getRole()) && !isPresident(model.getRole()) && !isConfigAdmin(model.getRole())) { + // 不是财务、经理的时候,按照原来的规则检查 + if (checkEntityId(model) == null) { + return Result.failed(false, "entity_id 未找到对应值"); + } + } + + boolean ret = saveModel(model); + + if (ret) { + model.setPassword(null); + + return Result.object(model); + } + + return Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } + if (e.getMessage().contains("Duplicate entry")) { + return Result.failed(false, "存在重复数据"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 修改 + * + * @param model BaseModel + * @return Result + */ + public Result update(Sysuser model) { + try { + Sysuser old = model.findByColumns("phone"); + Sysuser chkobj = model.findByPk(); // 按 id 找到旧的对象 + + // 注意这里有 !,找到后才做 update 操作 + if (chkobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + model.setType(chkobj.getType()); // type 不让修改 + + // 按手机号查出来的记录,不的当前更新的记录 + if (old != null && !old.getId().equals(model.getId())) { + return Result.failed(false, "手机号已存在"); + } + + BaseModel baseModel = checkEntityId(model); + + if (isTreasurer(model.getRole()) || isPresident(model.getRole())) { + if (model.getEntityId() == null) { // 没有从前端获取到 entity_id + model.setEntityId(null); // 如果不设置,upate 时,不会更新 entity_id, 如果要清空 entity_id 值,就需要手动设置为 null + } + } else { + // 不是财务、经理的时候,按照原来的规则检查 + if (baseModel == null) { + return Result.failed(false, "entity_id 未找到对应值"); + } + } + + model.remove("password"); // 更新用户信息,不更新密码 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + boolean ret = model.update(); + + // 如果是司机,需要更新司机信息 +// if (ret && chkobj.getType() != null && chkobj.getType().equals(UserTypeEnum.DRIVER.getTypeid()) && baseModel != null) { +// // 目前暂时只更新姓名、手机号 +// +// Driver olddriver = (Driver)baseModel; +// +// olddriver.setName(model.getName()); +// olddriver.setPhone(model.getPhone()); +// +// ret = olddriver.update(); +// } + + return ret; + } + }); + + return ret ? Result.object(model) : Result.failed(false, "编辑失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } + if (e.getMessage().contains("Duplicate entry")) { + return Result.failed(false, "存在重复数据"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + + /** + * 恢复被逻辑删除的数据 + * + * @param model + * @return + */ + public Result restore(BaseModel model) { + try { + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_VALID); // 逻辑删除字段统一用 del + + boolean ret = model.update(); + + Sysuser sysuser = Sysuser.dao.findById(model.get("id")); + + sysuser.remove("password"); + + return ret ? Result.object(sysuser) : Result.failed(false, "恢复失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "恢复失败"); + } + } + + /** + * 用户修改相关提示信息会少一点 + * 避免别人试错 + * + * @param token + * @param oldpwd + * @param newpwd + * @return + */ + public Result updatePassword(String token, String oldpwd, String newpwd) { + try { + Sysuser tokenuser = getSysuserByToken(token); // 用 token 获取到的用户没有密码 + + if (tokenuser == null) { + return Result.failed(false, "修改失败"); + } + + Sysuser sysuser = Sysuser.dao.findById(tokenuser.getId()); // 需要再从数据库中查询一次 + + String oldmd5 = getPwdMD5(sysuser.getPhone(), oldpwd); + + if (!sysuser.getPassword().equals(oldmd5)) { + return Result.failed(false, "修改失败"); + } + + String newmd5 = getPwdMD5(sysuser.getPhone(), newpwd); + + sysuser.setPassword(newmd5); + + boolean ret = sysuser.update(); + + sysuser.remove("password"); + + return ret ? Result.object(sysuser) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "修改失败"); + } + } + + + /** + * 重置密码 + * + * @param model 被修改的用户,只要id + * @param adminuser 验证当前用户是否是管理员 + * @return + */ + public Result resetPassword(Sysuser model, Sysuser adminuser) { + try { + // TODO 判断权限,若权限修改,这里也要调整 +// if (adminuser == null +// || !adminuser.getType().equals(UserTypeEnum.SUPERMARKET.getTypeid()) // 判断是否是砂场用户 +// || !adminuser.getRole().equals(RoleEnum.SUPERADMIN.getRoleid())) { // 判断是否是砂场管理员 +// return Result.permissionDenied(); +// } + + Sysuser sysuser = Sysuser.dao.findById(model.getId()); // 需要再从数据库中查询一次 + + if (sysuser == null) { + return Result.failed(false, "重置失败"); + } + + sysuser.setPassword(getPwdMD5(sysuser.getPhone(), Const.DEFAULT_PASSWORD)); + + boolean ret = sysuser.update(); + + sysuser.remove("password"); + + return ret ? Result.object(sysuser) : Result.failed(false, "重置失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "重置失败"); + } + } + + public Sysuser getUserByWhere(String name, String phone, String password) { + Sysuser sysuser = Sysuser.dao.findFirst("select * from sysuser where phone = ? and del = 0", phone); + + if (sysuser == null && StrKit.notBlank(name)) { + log.debug("按手机号未找到用户"); + sysuser = Sysuser.dao.findFirst("select * from sysuser where name = ? and del = 0", name); + } + + if (sysuser == null) { + log.debug("按姓名未找到用户"); + return null; + } + + String pwdmd5 = getPwdMD5(sysuser.getPhone(), password); + + if (!sysuser.getPassword().equals(pwdmd5)) { + log.debug("密码错误"); + return null; + } + + return sysuser; + } + + /** + * 登陆 + * 返回信息只写登陆失败,避免试错 + * + * @param name + * @param phone + * @param password + * @return + */ + public Result login(String name, String phone, String password) { + try { + Sysuser sysuser = getUserByWhere(name, phone, password); + + if (sysuser == null) { + return Result.failed(false, "登陆失败"); + } + +// if(!isConfigAdmin(sysuser.getRole()) +// && !isPresident(sysuser.getRole()) +// && !isPresidentView(sysuser.getRole()) +// && !isTreasurer(sysuser.getRole()) +// ){ +// return Result.permissionDenied(); +// } + + sysuser.setPassword(null); + String token = getToken(sysuser); + + Record out = new Record(); + out.set("tm", System.currentTimeMillis()); + out.set("user", sysuser); + + Redis.use().setex(tokenrediskey(token), expireAt, sysuser); + + return Result.success(new AuthResult(token, sysuser)); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "登陆失败"); + } + } + + /** + * 使用 token 从缓存中获取用户信息 + * + * @param token + * @return + */ + public Sysuser getSysuserByToken(String token) { + Sysuser sysuser = Redis.use().get(tokenrediskey(token)); + + if (sysuser != null) { + Redis.use().setex(tokenrediskey(token), expireAt, sysuser); // 刷新token + } + + return sysuser; + } + + public Page find(PageParam pp, String name, String phone, Integer del, Integer type, Integer entity_id) { + StringBuilder sqlbuf = new StringBuilder(); + sqlbuf.append(" from (\n"); + sqlbuf.append("select \n"); + sqlbuf.append(" u.id, u.phone, u.name, u.type, u.role, u.del\n"); + sqlbuf.append(" , case when u.type = 4 then d.trans_co_id else u.entity_id end entity_id\n"); + sqlbuf.append(" , case when u.type = 1 then s.name end supermarket_name \n"); + sqlbuf.append(" , case when u.type = 2 then t.name when u.type = 4 then t2.name end trans_co_name \n"); + sqlbuf.append(" , case when u.type = 3 then c.name end customer_name\n"); + sqlbuf.append(" , case when u.type = 4 then d.id end driver_id\n"); + sqlbuf.append(" from sysuser u \n"); + sqlbuf.append(" left join supermarket s on u.entity_id = s.id \n"); + sqlbuf.append(" left join transport_company t on u.entity_id = t.id \n"); + sqlbuf.append(" left join driver d on u.entity_id = d.id\n"); + sqlbuf.append(" left join transport_company t2 on d.trans_co_id = t2.id \n"); + sqlbuf.append(" left join customer c on u.entity_id = c.id\n"); + sqlbuf.append(") a\n"); + sqlbuf.append("where 1 = 1"); + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(name)) { + sqlbuf.append(" and a.name like ? \n"); + paraList.add("%" + name + "%"); + } + + if (StrKit.notBlank(phone)) { + sqlbuf.append(" and a.phone like ? \n"); + paraList.add("%" + phone + "%"); + } + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + sqlbuf.append(" and a.del = ? \n"); + paraList.add(del); + } + + if (type != null && type > 0) { + sqlbuf.append(" and a.type = ? \n"); + paraList.add(type); + } + + if (entity_id != null && entity_id > 0) { + sqlbuf.append(" and a.entity_id = ? \n"); + paraList.add(entity_id); + } + + return Db.paginate(pp.getPage(), pp.getSize(), "select * ", sqlbuf.toString(), paraList.toArray()); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/CmdLicenseValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/CmdLicenseValidator.java new file mode 100644 index 0000000..eda9aac --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/CmdLicenseValidator.java @@ -0,0 +1,18 @@ +package com.cowr.local.ssjygl.transport; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class CmdLicenseValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("which", "which" ,"which 必填"); + validateString("truck_license", 1, 10, "truck_license", "truck_license 长度 1~10"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualCreateValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualCreateValidator.java new file mode 100644 index 0000000..934cec1 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualCreateValidator.java @@ -0,0 +1,20 @@ +package com.cowr.local.ssjygl.transport; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class ManualCreateValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("truck_license", "truck_license" ,"truck_license 必填"); + validateBigDecimal("first_weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E10), "first_weight", "first_weight 范围 0~9.999999999999E10"); + validateBigDecimal("second_weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E10), "second_weight", "second_weight 范围 0~9.999999999999E10"); + validateRequired("password", "password" ,"password 必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualWeightValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualWeightValidator.java new file mode 100644 index 0000000..4b5feb1 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/ManualWeightValidator.java @@ -0,0 +1,20 @@ +package com.cowr.local.ssjygl.transport; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class ManualWeightValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateString("transport_id", 32, 32, "transport_id", "transport_id 长度 32,必填"); + validateRequired("which", "which" ,"which 必填"); + validateBigDecimal("weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E10), "weight", "weight 范围 0~9.999999999999E10"); + validateRequired("password", "password" ,"password 必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/PaySginValidator.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/PaySginValidator.java new file mode 100644 index 0000000..adda398 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/PaySginValidator.java @@ -0,0 +1,25 @@ +package com.cowr.local.ssjygl.transport; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class PaySginValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateString("uuid", 32, 32, "uuid", "uuid 长度 32,必填"); + validateString("order_sn", 16, 16, "order_sn", "order_sn 长度 16,必填"); + + String tran_scene = c.get("tran_scene"); + + if(!"B2C-JSAPI-ALIPAY".equals(tran_scene) && !"B2C-JSAPI-WECHAT".equals(tran_scene)){ + addError("tran_scene", "仅支持微信和支付宝付款"); + } + + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java new file mode 100644 index 0000000..81b2937 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportController.java @@ -0,0 +1,301 @@ +package com.cowr.local.ssjygl.transport; + +import com.cowr.common.base.BaseController; +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.main.AuthInterceptor; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.CacheData; +import com.cowr.ssjygl.order.OrderSnValidator; +import com.cowr.ssjygl.transport.LicenseValidator; +import com.cowr.ssjygl.transport.PostWeightValidator; +import com.cowr.ssjygl.transport.TransportIdValidator; +import com.jfinal.aop.Before; +import com.jfinal.aop.Clear; +import com.jfinal.kit.StrKit; +import com.jfinal.upload.UploadFile; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; + +@Clear(AuthInterceptor.class) +public class TransportController extends BaseController { + + /** + * 手动入场,代替车牌识别 + * TODO: 是否要标记,是手动入场、还是自动入场。手动入场,只能手动称重,自动入场能自动称重 + */ + @Before(LicenseValidator.class) + public void addLicense() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String truck_license = getUpperCaseVal("truck_license"); + String which = getUpperCaseVal("which", Enums.WhichEnum.R01.name()); + + renderJson(TransportSyncService.me.addLicense(truck_license, which, tokenuser)); + } + + /** + * 手动入场,代替车牌识别 + * TODO: 是否要标记,是手动入场、还是自动入场。手动入场,只能手动称重,自动入场能自动称重 + */ + @Before(LicenseValidator.class) + public void postLicense() { + File file = null; + + try { + UploadFile uploadFile = getFile(); + + if (uploadFile != null) { + file = uploadFile.getFile(); + } + } catch (Exception e) { + + } + + String truck_license = getUpperCaseVal("truck_license"); + String which = getUpperCaseVal("which", Enums.WhichEnum.R01.name()); + int supermarket_id = getInt("supermarket_id", CliCacheData.SUP.getId()); + + renderJson(Result.success(TransportSyncService.me.postLicense(supermarket_id, truck_license, file, which))); + } + + @Before(PostWeightValidator.class) + public void postWeight() { + String truck_license = getUpperCaseVal("truck_license"); + String which = getUpperCaseVal("which", Enums.WhichEnum.R01.name()); + Double weight = getParaToDouble("weight");//称重数值 + int supermarket_id = getInt("supermarket_id", CliCacheData.SUP.getId()); + + renderJson(Result.success(TransportSyncService.me.postWeigh(supermarket_id, truck_license, weight, which))); + } + + public void postLicenseQueue() { + String trucks = getUpperCaseVal("trucks", ""); + String which = getUpperCaseVal("which", Enums.WhichEnum.R01.name()); + + // 传空字符串时,清空队列 + if (StrKit.isBlank(trucks)) { + renderJson(Result.success(TransportDeviceService.me.postLicenseQueue(new ArrayList<>(), which))); + } else { + renderJson(Result.success(TransportDeviceService.me.postLicenseQueue(Arrays.asList(trucks.split(",")), which))); + } + + } + + /** + * 手动入场,代替车牌识别 + * TODO: 是否要标记,是手动入场、还是自动入场。手动入场,只能手动称重,自动入场能自动称重 + */ + @Before(LicenseValidator.class) + public void manualIn() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String truck_license = getUpperCaseVal("truck_license"); + String which = getUpperCaseVal("which", Enums.WhichEnum.R01.name()); + int supermarket_id = getInt("supermarket_id", CliCacheData.SUP.getId()); + + renderJson(Result.success(TransportSyncService.me.manualIn(supermarket_id, truck_license, which, tokenuser))); + } + + /** + * 手动输入重量 + */ + @Before(ManualWeightValidator.class) + public void manualWeight() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String transport_id = get("transport_id"); + String which = getUpperCaseVal("which", Enums.WhichEnum.R01.name()); + double weight = getParaToDouble("weight"); + String password = get("password"); + + if (!Enums.CtrlFlowEnum.isValid(which)) { + renderJson(Result.failed("which 参数错误")); + return; + } + + renderJson(TransportSyncService.me.manualWeight(transport_id, which, weight, tokenuser, password)); + } + + @Before({ManualCreateValidator.class}) + public void manualCreate() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + int supermarket_id = getInt("supermarket_id", CliCacheData.SUP.getId()); + String truck_license = getUpperCaseVal("truck_license"); + double first_weight = getParaToDouble("first_weight"); + double second_weight = getParaToDouble("second_weight"); + String out_which = getUpperCaseVal("out_which", Enums.WhichEnum.C01.name()); + String password = get("password"); + + if (!Enums.CtrlFlowEnum.isValid(out_which)) { + renderJson(Result.failed("which 参数错误")); + return; + } + + renderJson(TransportSyncService.me.manualCreate(supermarket_id, truck_license, first_weight, second_weight, out_which, tokenuser, password)); + } + + /** + * 调用硬件称重 + * //transport_id: 59 + * //which: R + * //deviceid: scale1 + */ + public void cmdWeight() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String transport_id = get("transport_id"); + String which = getUpperCaseVal("which", Enums.WhichEnum.R01.name()); + String deviceid = get("deviceid"); // TODO: 设置默认值 + + if (StrKit.notBlank(which)) { + which = which.toUpperCase(); + } + } + + @Before(CmdLicenseValidator.class) + public void cmdAddPlate() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String truck_license = getUpperCaseVal("truck_license"); + String which = get("which"); + + if (StrKit.notBlank(which)) { + which = which.toUpperCase(); + } + + if (StrKit.notBlank(truck_license)) { + truck_license = truck_license.toUpperCase(); + } + + String phone = get("phone");//验证账户 + String password = get("password");//验证密码 + + boolean result = TransportDeviceService.me.cmdAddLicense(truck_license, which, tokenuser); + renderJson(result ? Result.success(true) : Result.failed("加入入场识别历史失败")); + } + + @Before(CmdLicenseValidator.class) + public void cmdDelPlate() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String truck_license = getUpperCaseVal("truck_license"); + String which = get("which"); + + if (StrKit.notBlank(which)) { + which = which.toUpperCase(); + } + + if (StrKit.notBlank(truck_license)) { + truck_license = truck_license.toUpperCase(); + } + + boolean result = TransportDeviceService.me.cmdDelLicense(truck_license, which, tokenuser); + renderJson(result ? Result.success(true) : Result.failed("加入出场识别历史失败")); + } + + public void cmdResetFlow() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String which = get("which"); // Enums.WhichEnum R01 入场流程 C01 出场流程 + + if (StrKit.notBlank(which)) { + which = which.toUpperCase(); + } + + boolean result = TransportDeviceService.me.cmdResetFlow(which, tokenuser); + renderJson(result ? Result.success(true) : Result.failed("重置流程失败")); + } + + public void cmdRodUp() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + int num = getInt("num", 1); // 抬前闸 1,还是后闸 2 + String which = get("which"); // Enums.WhichEnum R01 入场流程 C01 出场流程 + + if (StrKit.notBlank(which)) { + which = which.toUpperCase(); + } + + boolean result = TransportDeviceService.me.cmdRodUp(num, which, tokenuser); + renderJson(result ? Result.success(true) : Result.failed("抬闸失败")); + } + + @Before(TransportIdValidator.class) + public void cancel() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.permissionDenied()); + return; + } + + String transport_id = get("transport_id"); + + renderJson(TransportSyncService.me.cancel(transport_id, tokenuser)); + } + +// @Before(OrderSnValidator.class) +// public void backPay() { +// Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); +// +// if (tokenuser == null) { +// renderJson(Result.permissionDenied()); +// return; +// } +// +// String order_sn = get("order_sn"); +// +// renderJson(TransportSyncService.me.backPay(order_sn, tokenuser)); +// } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportDeviceService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportDeviceService.java new file mode 100644 index 0000000..a96583a --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportDeviceService.java @@ -0,0 +1,280 @@ +package com.cowr.local.ssjygl.transport; + +import com.cowr.common.enums.Enums; +import com.cowr.local.ssjygl.actioncmdlog.ActionCmdLogService; +import com.cowr.local.ssjygl.devicectrl.controllers.Controller; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.main.Config; +import com.cowr.model.Sysuser; +import com.cowr.ssjygl.CacheData; +import com.jfinal.kit.HttpKit; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Record; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 出入场设备控制,不涉及直接修改数据库 + * 该类负责硬件交互,不涉及 MySQL 业务数据的修改,操作动作会存数据库 + */ +public class TransportDeviceService { + private static Log log = Log.getLog(TransportDeviceService.class); + public static TransportDeviceService me = new TransportDeviceService(); + private static final int maxhislen = 3; // 保留的历史队列长度 + + private static final ThreadLocal sdf = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + + public Record real(){ + Record out = new Record(); + out.set("inHis", CliCacheData.licenseInHis); + out.set("inQueue", CliCacheData.licenseInQueue); + out.set("outQueue", CliCacheData.licenseOutQueue); + out.set("nowLicense", CliCacheData.nowLicenseMap); + out.set("nowWeight", CliCacheData.nowWeightMap); + + return out; + } + + /** + * @param licenses + * @param which + * @return + */ + public boolean postLicenseQueue(List licenses, String which) { + if (StrKit.isBlank(which)) { + return false; + } + + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { // 入场流程 + CliCacheData.licenseInQueue.put(which, licenses); + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + } else if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { // 出场流程 + CliCacheData.licenseOutQueue.put(which, licenses); + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + } else if (which.startsWith(Enums.CtrlFlowEnum.T.name())) { // 同一个摄像头,同进同出,根据数据判断是出,还是入 + CliCacheData.licenseSameQueue.put(which, licenses); + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + } else { + return false; + } + + return true; + } + + /** + * 已识别车牌历史 + */ + public void addLicenseHistory(Record truck, String which, int state) { + try { + if (truck == null) { + return; + } + + truck.set("tm", sdf.get().format(new Date())); + truck.set("state", state); + + List his = CliCacheData.licenseInHis.get(which); + + if(his == null){ + his = new ArrayList<>(); + his.add(truck); + + CliCacheData.licenseInHis.put(which, his); + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + return; + } + + // 排序后,移除第一个,然后再加入历史 + his.sort(new Comparator() { + public int compare(Record o1, Record o2) { + int d1 = o1.getInt("index"); + int d2 = o2.getInt("index"); + + if (d1 > d2) { + return 1; + } else if (d1 == d2) { + return 0; + } + + return -1; + } + }); + + // 里面有内容,就取出最后一个,判断是否重复 + if (!his.isEmpty()) { + Record last = his.get(his.size() - 1); + + if (last != null && truck.getStr("license").equals(last.getStr("license"))) { + log.debug("车牌号 " + truck.getStr("license") + " 已在尾部,更新识别时间、状态。可能是重复识别"); + + last.set("tm", sdf.get().format(new Date())); + last.set("state", state); + + return; + } + } + + // 少于 maxhislen 个,直接加入 + // 达到 maxhislen 上限,则删除最前面的之后,再加入 + if (his.size() >= maxhislen) { + his.remove(0); + } + + his.add(truck); + + for (int i = 0; i < his.size(); i++) { + his.get(i).set("index", i); + } + + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + /** + * 添加车牌到队列,或者从队列删除车牌 + * + * @param license + * @param which + * @param delete + * @return + */ + public boolean cmdLicense(String license, String which, boolean delete) { + boolean ret = Config.deviceThread.cmdLicense(license, which, delete); + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + return ret; + } + + /** + * 添加车牌到队列 + * + * @param license + * @param which + * @param sysuser + * @return + */ + public boolean cmdAddLicense(String license, String which, Sysuser sysuser) { + Record cmdlog = new Record(); + cmdlog.set("cmd", "cmdAddLicense"); + cmdlog.set("license", license); + cmdlog.set("which", which); + + return cmdLicense(license, which, false) && ActionCmdLogService.me.save(cmdlog.toJson(), sysuser); + } + + /** + * 从队列中删除车牌 + * + * @param license + * @param which + * @param sysuser + * @return + */ + public boolean cmdDelLicense(String license, String which, Sysuser sysuser) { + Record cmdlog = new Record(); + cmdlog.set("cmd", "cmdDelLicense"); + cmdlog.set("license", license); + cmdlog.set("which", which); + + // 2019-09-04 如果是删除入场,则从识别历史里面删除记录 + if (StrKit.notBlank(which) && which.toUpperCase().startsWith(Enums.CtrlFlowEnum.R.name())) { + List his = CliCacheData.licenseInHis.get(which); + + if (his != null && !his.isEmpty()) { + // 删除入场识别历史 + for (Record record : his) { + if (record != null && StrKit.notBlank(record.get("license"), license) && license.equals(record.get("license"))) { + his.remove(record); + break; + } + } + } + + List rklist = CliCacheData.licenseInQueue.get(which); + + if (rklist != null && !rklist.isEmpty()) { + // 删除入场识别队列 + for (String queuelicense : rklist) { + if (queuelicense != null && StrKit.notBlank(queuelicense, license) && queuelicense.equals(queuelicense)) { + // 如果车辆在入场识别队列中,则执行原删除入场队列流程,向硬件客户端发送删除指令 + return cmdLicense(queuelicense, which, true); + } + } + } + + ActionCmdLogService.me.save(cmdlog.toJson(), sysuser); + return true; + } else { + ActionCmdLogService.me.save(cmdlog.toJson(), sysuser); + return cmdLicense(license, which, true); + } + } + + /** + * 重置设备状态 + * + * @param sysuser + * @return + */ + public boolean cmdResetFlow(String which, Sysuser sysuser) { + Record cmdlog = new Record(); + cmdlog.set("cmd", "cmdResetFlow"); + cmdlog.set("which", which); + + CliCacheData.nowLicenseMap.put(which, ""); + CliCacheData.nowWeightMap.put(which, 0d); + + return Config.deviceThread.cmdResetFlow(which) && ActionCmdLogService.me.save(cmdlog.toJson(), sysuser); + } + + public boolean cmdRodUp(int num, String which, Sysuser sysuser){ + Record cmdlog = new Record(); + cmdlog.set("cmd", "cmdRodUp1"); + cmdlog.set("which", which); + cmdlog.set("num", num); + + try{ + Config.deviceThread.cmdRodUp(num, which); + return ActionCmdLogService.me.save(cmdlog.toJson(), sysuser); + }catch (Exception e){ + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 调用相机接口,手动触发识别 + * @param which + * @param sysuser + */ + public void manualTrigger(String which, Sysuser sysuser){ + Record cmdlog = new Record(); + cmdlog.set("cmd", "manual_trigger_info"); + cmdlog.set("which", which); + + Controller controller = Config.deviceThread.getController(which); + if(controller == null){ + log.debug("按 %s, 未找到 Controller"); + return; + } + + if(controller.getCamera() == null || controller.getCamera().getIp() == null){ + log.debug("Controller 为初始化"); + return; + } + + try{ + HttpKit.post("http://" + controller.getCamera().getIp() + "/cgi-bin/param.cgi?random=" + Math.random(), "key=manual_trigger_info"); + ActionCmdLogService.me.save(cmdlog.toJson(), sysuser); + }catch (Exception e){ + log.error(e.getMessage(), e); + } + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryController.java new file mode 100644 index 0000000..a5375d9 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryController.java @@ -0,0 +1,141 @@ +package com.cowr.local.ssjygl.transport; + +import com.cowr.common.Interceptor.CorsInterceptor; +import com.cowr.common.base.BaseController; +import com.cowr.common.enums.Enums; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.main.AuthInterceptor; +import com.cowr.local.ssjygl.main.Config; +import com.cowr.model.Supermarket; +import com.cowr.ssjygl.order.OrderSnValidator; +import com.cowr.ssjygl.supermarket.SupermarketIdValidator; +import com.cowr.ssjygl.transport.TransportIdValidator; +import com.cowr.ssjygl.transport.TransportService; +import com.jfinal.aop.Before; +import com.jfinal.aop.Clear; +import com.jfinal.kit.StrKit; + +/** + * 出入场相关记录查询 + */ +public class TransportQueryController extends BaseController { + + public void real() { + renderJson(Result.success(TransportDeviceService.me.real())); + } + + /** + * 分页查找 transport 场内运输记录 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + Integer supermarket_id = getInt("supermarket_id"); + String order_sn = get("order_sn"); + String stm = get("stm"); + String etm = get("etm"); + Integer trans_co_id = getInt("trans_co_id"); + Integer state = getInt("state"); + String truck_license = getUpperCaseVal("truck_license"); + renderJson(Result.object(TransportService.me.find(pp, order_sn, stm, etm, truck_license, supermarket_id, trans_co_id, state))); + } + + /** + * 已入场车辆 + */ + public void inSupermarket() { + int supermarket_id = getInt("supermarket_id", 0); + renderJson(Result.object(TransportService.me.inSupermarket(supermarket_id))); + } + + @Before(TransportIdValidator.class) + public void transportInfo() { + String transport_id = get("transport_id"); + + renderJson(TransportQueryService.me.transportInfo(transport_id)); + } + + @Before(TransportIdValidator.class) + public void caleTotalPrice() { + String transport_id = get("transport_id"); + Integer product_id = getInt("product_id"); + Integer ordercluster_id = getInt("ordercluster_id"); + + if (product_id != null) { + renderJson(TransportQueryService.me.caleProductTotalPrice(transport_id, product_id)); + } else if (ordercluster_id != null) { + renderJson(TransportQueryService.me.caleOrderclusterTotalPrice(transport_id, ordercluster_id)); + } else { + renderJson(Result.failed("参数错误")); + } + } + + @Before(SupermarketIdValidator.class) + @Clear(AuthInterceptor.class) + public void qrcode() { + String which = get("which"); + Integer supermarket_id = getInt("supermarket_id"); + + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket == null) { + renderJson(Result.failed("未找到有效的超市信息")); + return; + } + + if (StrKit.isBlank(which) || !which.startsWith(Enums.CtrlFlowEnum.C.name())) { + renderJson(Result.failed("出口ID错误")); + return; + } + +// renderQrCode(Config.configprop.get("base.url") + +// "/transport/query/waitPay?supermarket_id=" + +// supermarket_id +// + "&which=" + which, 512, 512); +// "http://192.168.1.16/apppay/waitPay.html?v=20200714&supermarket_id=" + + renderQrCode( + "http://qaky.cloudowr.cn/apppay/waitPay.html?v=20200714&supermarket_id=" + + supermarket_id + + "&which=" + which, 512, 512); + } + + @Before(CorsInterceptor.class) + @Clear(AuthInterceptor.class) + public void waitPay() { + String truck_license = getUpperCaseVal("truck_license"); + String which = getUpperCaseVal("which"); + Integer supermarket_id = getInt("supermarket_id"); + + renderJsonp(TransportQueryService.me.waitPay(supermarket_id, which, truck_license)); + } + + @Before(CorsInterceptor.class) + @Clear(AuthInterceptor.class) + public void waitPayList() { + String which = getUpperCaseVal("which"); + Integer supermarket_id = getInt("supermarket_id"); + + renderJsonp(TransportQueryService.me.waitPayList(supermarket_id, which)); + } + +// @Before({PaySginValidator.class, CorsInterceptor.class}) +// @Clear(AuthInterceptor.class) +// public void getPaySign() { +// String uuid = get("uuid"); +// String order_sn = get("order_sn"); // 业务系统订单号 +// +// // 支付场景 +// // B2C-JSAPI-ALIPAY 支付宝内置浏览器 +// // B2C-JSAPI-WECHAT 微信内置浏览器 +// String tran_scene = get("tran_scene"); +// +// renderJsonp(TransportQueryService.me.getPaySign(uuid, order_sn, tran_scene)); +// } + + @Before({OrderSnValidator.class, CorsInterceptor.class}) + @Clear(AuthInterceptor.class) + public void completePay(){ + String order_sn = get("order_sn"); // 业务系统订单号 + renderJsonp(TransportQueryService.me.completePay(order_sn)); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java new file mode 100644 index 0000000..b57d19c --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportQueryService.java @@ -0,0 +1,399 @@ +package com.cowr.local.ssjygl.transport; + +import com.cowr.common.base.BaseModel; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +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.local.ssjygl.order.OrderService; +import com.cowr.local.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.transprice.TransPriceService; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * 出入场相关记录查询,不涉及修改 + */ +public class TransportQueryService { + private static Log log = Log.getLog(TransportQueryService.class); + public static TransportQueryService me = new TransportQueryService(); + + public Result transportInfo(String transport_id) { + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("未找到有效的出入场记录"); + } + + if (transport.getFirstWeight() == null && transport.getSecondWeight() == null) { + return Result.failed("重量数据不完整"); + } + + BigDecimal net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()).abs(); + Record transobj = transport.toRecord(); + Record prepayinfo = PrepayService.me.prepayInfo(transport); + + if (prepayinfo != null) { + transobj.setColumns(prepayinfo); + } else { + transobj.set("prepay_truck", false); + } + + transobj.set("weight", net_weight); + transobj.set("net_weight", net_weight); + + // 1. 没有关联订单 + if (StrKit.isBlank(transport.getOrderSn())) { + Truck truck = Truck.dao.findById(transport.getTruckLicense()); + if (truck != null) { // 表示是物流公式车辆 + TransportCompany tc = TransportCompany.dao.findById(truck.getTransCoId()); + transobj.set("trans_co_id", tc.getId()); + transobj.set("trans_co_name", tc.getName()); + } + } else { + // 2. 有 order_sn + BaseModel snmodel = OrderService.me.getOrderBySn(transport.getOrderSn()); + + if (snmodel == null) { + return Result.failed("关联订单信息错误"); + } + + // 正在等待支付的, 查询一次银行状态 + if(snmodel.getInt("state") == OrderStateEnum.LEAVE.getStateid()){ +// Bocomm bocomm = Bocomm.dao.findFirst( +// "select * from bocomm t where t.order_sn = ? and t.state <= ? limit 0,1", +// transport.getOrderSn(), +// OrderStateEnum.RECEIVED.getStateid() +// ); +// +// if(bocomm != null){ +// BocommService.me.queryTran(bocomm.getPaymertranno(), Enums.PrinterIdEnum.printer1.name()); +// +// // 再查一次订单信息 +// snmodel = OrderService.me.getOrderBySn(transport.getOrderSn()); +// } + } + + transobj.remove("id"); + transobj.remove("state"); // 移除 transport 的 state 信息,用 order 的 state + + transobj.setColumns(snmodel.toRecord()); + } + + Supermarket supermarket = Supermarket.dao.findById(transport.getSupermarketId()); + if (supermarket != null) { + transobj.set("supermarket_name", supermarket.getName()); + } + + if(transport.getType() != null && transport.getType() == OrderTypeEnum.PURCHASE.getTypeid()){ + Purchase purchase = Purchase.dao.findById(transobj.get("purchase_id")); + if (purchase != null) { + transobj.set("purchase_name", purchase.getName()); + } + } + + return Result.success(transobj); + } + + /** + * 按品类计算 + * + * @param transport_id + * @param product_id + * @return + */ + public Result caleProductTotalPrice(String transport_id, int product_id) { + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + BigDecimal min = new BigDecimal(0); + // 验证重量 + 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 net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()).abs(); + BigDecimal up = SupermarketProductService.me.getUnitPrice(transport.getSupermarketId(), product_id); + BigDecimal total = TransPriceService.me.caleTotalPrice(up, net_weight); + + Record out = new Record(); + out.set("unit_price", up); + out.set("net_weight", net_weight); + out.set("total_price", total); + + return Result.success(out); + } + + /** + * 按集团订单计算 + * + * @param transport_id + * @param ordercluster_id + * @return + */ + public Result caleOrderclusterTotalPrice(String transport_id, int ordercluster_id) { + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("进出场记录不能为空"); + } + BigDecimal min = new BigDecimal(0); + // 验证重量 + 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()); + } + + Ordercluster ordercluster = Ordercluster.dao.findById(ordercluster_id); + if (ordercluster == null) { + return Result.failedstr("集团订单【%s】信息不存在", ordercluster_id); + } + + BigDecimal net_weight = transport.getSecondWeight().subtract(transport.getFirstWeight()).abs(); + BigDecimal up = SupermarketProductService.me.getUnitPrice(transport.getSupermarketId(), ordercluster.getProductId()); + BigDecimal total = TransPriceService.me.caleTotalPrice(up, net_weight); + + Record out = new Record(); + out.set("unit_price", up); + out.set("net_weight", net_weight); + out.set("total_price", total); + + return Result.success(out); + } + + public Result qrcode(int supermarket_id, String which) { + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket == null) { + return Result.failed("未找到有效的超市信息"); + } + + if (StrKit.isBlank(which) || !which.startsWith(Enums.CtrlFlowEnum.C.name())) { + return Result.failed("出口ID错误"); + } + + try { + return Result.success(ImageUtil.getQRCodeBase64( + Config.configprop.get("base.url") + + "/transport/query/waitPay?supermarket_id=" + + supermarket_id + + "&which" + which, 512, 512, "JPG")); + } catch (Exception e) { + return Result.failed(e.getMessage()); + } + } + + /** + * 查询等待支付的出入场记录 + * + * @param supermarket_id + * @param which + * @return + */ + public Result waitPay(int supermarket_id, String which, String truck_license) { + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket == null) { + return Result.failed("未找到有效的超市信息"); + } + + if (StrKit.isBlank(which) || !which.startsWith(Enums.CtrlFlowEnum.C.name())) { + return Result.failed("出口ID错误"); + } + + String sql = "select a.*, " + + " p.supermarket_id, p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode, p.first_weight, " + + " p.second_weight, p.first_weigh_mode, p.second_weight_mode, p.first_pic, p.first_weight_which, " + + " p.second_weight_which, p.second_pic, p.arrive_time, p.type, p.memo, p.change_time, p.trans_co_id, " + + " p.trans_co_name, p.trans_co_texpayer_name, p.trans_co_texpayer_num, p.trans_co_address, " + + " p.trans_co_phone, p.trans_co_bank_name, p.trans_co_bank_account, " + + " s.name supermarket_name from (\n" + + " select t.sn, truck_license, t.weight, t.total_price, t.unit_price, t.product_id, t.product_name, t.create_time, t.state \n" + + " from order_sale t \n" + + " where t.state = ? \n" + + " and t.supermarket_id = ? \n" + + " union\n" + + " select t.sn, truck_license, t.weight, t.total_price, t.unit_price, t.product_id, t.product_name, t.create_time, t.state \n" + + " from order_temp t \n" + + " where t.state = ? \n" + + " and t.supermarket_id = ? \n" + + " ) a\n" + + " left join transport p on p.order_sn = a.sn \n" + + " left join supermarket s on s.id = p.supermarket_id \n" + + " where p.out_which = ? \n"; + + List paraList = new ArrayList<>(); + paraList.add(OrderStateEnum.LEAVE.getStateid()); // 这里用这个状态标记等等结算 + paraList.add(supermarket_id); + paraList.add(OrderStateEnum.LEAVE.getStateid()); // 这里用这个状态标记等等结算 + paraList.add(supermarket_id); + paraList.add(which); + + if (StrKit.notBlank(truck_license)) { + sql += " and a.truck_license = ? \n"; + paraList.add(truck_license); + } + + sql += " order by a.create_time desc limit 0,1"; + + Record record = Db.findFirst(sql, paraList.toArray()); + + if (record == null) { + return Result.success("当前无待结算车辆"); + } + + return Result.success(record); + } + + + /** + * 查询等待支付的出入场记录 + * + * @param supermarket_id + * @param which + * @return + */ + public Result waitPayList(int supermarket_id, String which) { + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket == null) { + return Result.failed("未找到有效的超市信息"); + } + + if (StrKit.isBlank(which) || !which.startsWith(Enums.CtrlFlowEnum.C.name())) { + return Result.failed("出口ID错误"); + } + + String sql = "select a.*, " + + " p.supermarket_id, p.in_time, p.out_time, p.in_which, p.out_which, p.in_mode, p.out_mode, p.first_weight, " + + " p.second_weight, p.first_weigh_mode, p.second_weight_mode, p.first_pic, p.first_weight_which, " + + " p.second_weight_which, p.second_pic, p.arrive_time, p.type, p.memo, p.change_time, p.trans_co_id, " + + " p.trans_co_name, p.trans_co_texpayer_name, p.trans_co_texpayer_num, p.trans_co_address, " + + " p.trans_co_phone, p.trans_co_bank_name, p.trans_co_bank_account, " + + " s.name supermarket_name from (\n" + + " select t.sn, truck_license, t.weight, t.total_price, t.unit_price, t.product_id, t.product_name, t.create_time, t.state \n" + + " from order_sale t \n" + + " where t.state = ? \n" + + " and t.supermarket_id = ? \n" + + " union\n" + + " select t.sn, truck_license, t.weight, t.total_price, t.unit_price, t.product_id, t.product_name, t.create_time, t.state \n" + + " from order_temp t \n" + + " where t.state = ? \n" + + " and t.supermarket_id = ? \n" + + " ) a\n" + + " left join transport p on p.order_sn = a.sn \n" + + " left join supermarket s on s.id = p.supermarket_id \n" + + " where p.out_which = ? \n"; + + List paraList = new ArrayList<>(); + paraList.add(OrderStateEnum.LEAVE.getStateid()); // 这里用这个状态标记等等结算 + paraList.add(supermarket_id); + paraList.add(OrderStateEnum.LEAVE.getStateid()); // 这里用这个状态标记等等结算 + paraList.add(supermarket_id); + paraList.add(which); + + sql += " order by a.create_time desc "; // 按最后更新时间排序 + + List list = Db.find(sql, paraList.toArray()); + + return Result.success(list); + } + +// /** +// * 获取银行支付加签字符串 +// * +// * @param uuid +// * @param order_sn +// * @param tran_scene +// * @return +// */ +// public Result getPaySign(String uuid, String order_sn, String tran_scene) { +// BaseModel snorder = OrderService.me.getOrderBySn(order_sn); +// +// if (snorder == null) { +// return Result.failed("未找到有效的订单信息!"); +// } +// +// Bocomm bocomm = new Bocomm(); +// bocomm.setUuid(uuid); +// +// if (bocomm.checkDuplicate("uuid")) { +// return Result.failed("订单已提交,请不要重复提交!"); +// } +// +// List oldbocomms = Bocomm.dao.find( +// "select * from bocomm t where t.order_sn = ? and t.state <= ?", order_sn, OrderStateEnum.RECEIVED.getStateid()); +// +// for (Bocomm b : oldbocomms) { +// if (b.getState() == OrderStateEnum.RECEIVED.getStateid()) { +// return Result.failed("订单已支付完成,请不要重复支付!"); +// } else { +// return Result.failed("订单已提交。若支付失败,请联系现场管理员!"); +// } +// } +// +// String amount = String.format("%.2f", snorder.getBigDecimal("total_price")); // 实际需要支付的金额,测试使用 0.01 +// String content = DateTimeUtil.sdfhm.get().format(new Date()) + snorder.getStr("truck_license") + "购买" + snorder.getStr("product_name") + String.format("%.2f", snorder.getBigDecimal("weight")) + "吨"; +// +// log.debug(order_sn + " 实际需要支付的金额:" + amount); +// +// String sign = BocommService.me.getPaySign( +// uuid, +// order_sn, +// tran_scene, +// amount, +// content, +// content +// ); +// +// if (sign == null) { +// return Result.failed("获取加签数据失败,无法进行支付"); +// } +// +// return Result.success(sign); +// } + + public Result completePay(String order_sn) { + if (StrKit.isBlank(order_sn) || order_sn.length() < 12) { + return Result.failed("参数无效"); + } + + Record snorder = null; + int sntype = Integer.parseInt(order_sn.substring(10, 12)); + + if (sntype == OrderTypeEnum.SALE.getTypeid()) { + snorder = OrderSaleService.me.get(order_sn); + } else if (sntype == OrderTypeEnum.TEMP.getTypeid()) { + snorder = OrderTempService.me.get(order_sn); + } + + if (snorder == null) { + return Result.failed("未找到有效的订单信息"); + } + + return Result.success(snorder); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java new file mode 100644 index 0000000..504f59a --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transport/TransportSyncService.java @@ -0,0 +1,865 @@ +package com.cowr.local.ssjygl.transport; + +import com.cowr.common.base.BaseModel; +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.enums.TruckRodState; +import com.cowr.common.view.Result; +import com.cowr.local.ssjygl.devicectrl.common.Const; +import com.cowr.local.ssjygl.main.CliCacheData; +import com.cowr.local.ssjygl.main.Config; +import com.cowr.local.ssjygl.order.OrderService; +import com.cowr.local.ssjygl.synctask.SyncTaskService; +import com.cowr.local.ssjygl.system.sysuser.SysuserService; +import com.cowr.model.*; +import com.cowr.ssjygl.CacheData; +import com.cowr.ssjygl.authlicense.AuthLicenseService; +import com.cowr.ssjygl.blacklist.BlacklistService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.prepay.prepaytruck.PrepayTruckService; +import com.cowr.ssjygl.transport.TransportService; +import com.cowr.ssjygl.truck.TruckService; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; +import net.coobird.thumbnailator.Thumbnails; + +import java.io.File; +import java.math.BigDecimal; +import java.sql.SQLException; +import java.util.*; + +/** + * 该类下会操作 MySQL 数据,需要将修改的数据同步到服务端 + */ +public class TransportSyncService { + public static TransportSyncService me = new TransportSyncService(); + private static Log log = Log.getLog(TransportSyncService.class); + + /** + * 加入授权车牌,并模拟触发车牌识别 + * + * @return 返回给web端使用 + */ + public Result addLicense(String truck_license, String which, Sysuser sysuser) { + Blacklist bl = BlacklistService.me.truckInBlacklist(truck_license); + + if (bl != null) { + return Result.failed("车辆【%s】在黑名单中!", truck_license); + } + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(truck_license); + + if (authlic.checkExistsByPk()) { + return Result.success("车辆【" + truck_license + "】已经在系统内"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return authlic.save() + && SyncTaskService.me.save(new SyncTask().addSaveData(authlic)) + && ModifyLogService.me.save(authlic, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + if (ret) { + TransportDeviceService.me.manualTrigger(which, sysuser); + } + + return ret ? Result.success(authlic) : Result.failed("添加失败"); + } + + /** + * 硬件提交车牌 + * 车识图像异步存储,提高响应速度 + * 1.创建或者更新 transport 表 + *

+ * which 可能的情况 + * 1.一进一出 + * 2.单进单出(同进同出) + * 3.一进多出 + * 4.多进一出 + *

+ * TODO: 判断是否有未处理完的出入场记录,推送消息提示前端处理 + * + * @param truck_license + * @param which + * @return + */ + public PostLicenseResult postLicense(int supermarket_id, String truck_license, File file, String which) { + PostLicenseResult result = new PostLicenseResult(truck_license); + + try { + if (!Enums.CtrlFlowEnum.isValid(which)) { + deleteImg(file); // 数据无效时,删除图片 + return result; + } + + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { + in(supermarket_id, result, file, which); + } else if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { + out(supermarket_id, result, file, which); + } else if (which.startsWith(Enums.CtrlFlowEnum.T.name())) { + common(supermarket_id, result, file, which); + } + + if (result.isAccess()) { + Config.socketio.pubRefreshInSup(TransportDeviceService.me.real()); + } + + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + result.setUploaded(true); + + return result; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + return result; + } + + /** + * 硬件提交重量 + * + * @param truck_license + * @param weight + * @param which + * @return + */ + public boolean postWeigh(int supermarket_id, String truck_license, Double weight, String which) { + try { + if (!Enums.CtrlFlowEnum.isValid(which)) { + return false; + } + + Transport transport = TransportService.me.undoneTransport(supermarket_id, truck_license); + + if (transport == null) { + log.error("车辆【%s】未找到入场记录!", truck_license); + //TODO: 通知 web 端。弄一个不一样的颜色显示到出场识别队列里面? + return false; + } else if (transport.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + log.error("车辆【%s】出入场记录已完结、或者已取消,不能修改!", truck_license); + //TODO: 通知 web 端。弄一个不一样的颜色显示到出场识别队列里面? + return false; + } + + boolean ret = false; + + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { + ret = inWeigh(transport, weight, which); + } else if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { + ret = outWeigh(transport, weight, which); + } else if (which.startsWith(Enums.CtrlFlowEnum.T.name())) { + ret = commonWeigh(transport, weight, which); + } + + if (ret) { + Config.socketio.pubRefreshInSup(TransportDeviceService.me.real()); + } + + Config.socketio.pubRefreshReal(TransportDeviceService.me.real()); + + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + return false; + } + + private void deleteImg(File file) { + if (file != null) { + file.deleteOnExit(); + } + } + + private String saveImg(File file) { + try { + if (file == null) { + return null; + } + + String uuid = StrKit.getRandomUUID(); + String fileName = file.getName(); + String prefix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); + String savefilename = uuid + "." + prefix; + String savethumbnail = Config.getRootPath() + File.separator + Const.LicenseImgTmpFolder + File.separator + uuid + "_thumbnail." + prefix; + String key = Const.LicenseImgTmpFolder + "/" + savefilename; // 存储路径, 这个斜杠是http用的,肯定是正斜杠 + + Thumbnails.of(file.getAbsolutePath()).scale(0.5f).outputFormat(prefix).toFile(savethumbnail); + + file.renameTo(new File(Config.getRootPath() + File.separator + Const.LicenseImgTmpFolder + File.separator + savefilename)); // 重命名文件 + + return key; + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } + } + + /** + * 入场识别操作 + * + * @param result + * @return + */ + private PostLicenseResult in(int supermarket_id, PostLicenseResult result, File file, String which) { + // 从预付费车辆中找 + // 单独用 pt 对象存储,是后面还要用是否有预付费,来判断订单类型 + // 是预付,则肯定是销售或者外销,如果有物流公司id,则肯定是销售,否是外销 + Record pt = PrepayTruckService.me.checkValidLicense(supermarket_id, result.getLicense()); + + Record lichisobj = new Record(); + if (pt != null) { + lichisobj = pt; + } else { + lichisobj.set("license", result.getLicense()); + } + + TransportDeviceService.me.addLicenseHistory(lichisobj, which, lichisobj.get("trans_co_id") != null ? TruckRodState.state_2 : TruckRodState.state_1); + + if (pt == null && !AuthLicenseService.me.isAuthLicense(result.getLicense())) { + log.error("【%s】未授权,可能是在黑名单中,或者第一次入场", result.getLicense()); + Config.socketio.pubMessage(new Record().set("truck_license", result.getLicense()).set("msg", result.getLicense() + " 未授权。可能是在黑名单中,或者第一次入场")); + return result; + } + + Transport oldtransport = TransportService.me.undoneTransport(supermarket_id, result.getLicense()); + + if (oldtransport != null) { + log.error("【" + result.getLicense() + "】有未完成的入场记录,请先处理完毕!"); + Config.socketio.pubMessage(new Record().set("truck_license", result.getLicense()).set("msg", result.getLicense() + " 有未完成的入场记录,请先处理完毕!")); + return result; + } + + Transport transport = new Transport(); + transport.setId(StrKit.getRandomUUID()); + transport.setSupermarketId(supermarket_id); + transport.setTruckLicense(result.getLicense()); + transport.setInTime(new Date()); + transport.setInWhich(which); + transport.setState(OrderStateEnum.ENTERED.getStateid()); // 2,入场 + transport.setFirstPic(saveImg(file)); + + // 入场的时候,就可以根据是否预付车辆,确定类型 + if (pt != null) { + transport.setType(pt.get("trans_co_id") != null ? OrderTypeEnum.SALE.getTypeid() : OrderTypeEnum.TEMP.getTypeid()); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = transport.save() && SyncTaskService.me.save(new SyncTask().addSaveData(transport)); + + return ret; + } catch (Exception e) { + return false; + } + } + }); + + + if (ret) { + // 只有入场时需要 + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { + TransportDeviceService.me.addLicenseHistory(lichisobj, which, TruckRodState.state_4); + } + + CliCacheData.nowLicenseMap.put(which, result.getLicense()); + CliCacheData.nowWeightMap.put(which, null); + } + + result.setTransportId(transport.getId()); + result.setAccess(ret); + result.setFlow(Enums.CtrlFlowEnum.R.name()); + + return result; + } + + /** + * 出场识别操作 + * + * @param result + * @return + */ + private PostLicenseResult out(int supermarket_id, PostLicenseResult result, File file, String which) { + Transport transport = TransportService.me.undoneTransport(supermarket_id, result.getLicense()); + + if (transport == null) { + log.error("车辆【" + result.getLicense() + "】未找到入场记录!"); + Config.socketio.pubMessage(new Record().set("truck_license", result.getLicense()).set("msg", result.getLicense() + " 未找到入场记录!")); + return result; + } + + transport.setOutTime(new Date()); + transport.setOutWhich(which); + transport.setSecondPic(saveImg(file)); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = transport.update() && SyncTaskService.me.save(new SyncTask().addUpdateData(transport)); + + return ret; + } catch (Exception e) { + return false; + } + } + }); + + if (ret) { + CliCacheData.nowLicenseMap.put(which, result.getLicense()); + CliCacheData.nowWeightMap.put(which, null); + } + + result.setTransportId(transport.getId()); + result.setAccess(ret); + result.setFlow(Enums.CtrlFlowEnum.C.name()); + + return result; + } + + /** + * 一个磅,一个摄像头,同进同出 + * 一个磅,两个摄像头可以模拟出一进一出,不属于同进同出 + * + * @return + */ + private PostLicenseResult common(int supermarket_id, PostLicenseResult result, File file, String which) { + // 从预付费车辆中找 + Record pt = PrepayTruckService.me.checkValidLicense(supermarket_id, result.getLicense()); + + if (pt == null && !AuthLicenseService.me.isAuthLicense(result.getLicense())) { + log.error("车牌【%s】未授权,可能是在黑名单中,或者第一次入场", result.getLicense()); + //TODO: 发消息到web端? + return result; + } + + Transport transport = TransportService.me.undoneTransport(supermarket_id, result.getLicense()); + Date now = new Date(); + boolean ret = false; + + // 没有找到入场记录,就走入场流程 + if (transport == null) { + transport = new Transport(); + transport.setId(StrKit.getRandomUUID()); + transport.setSupermarketId(supermarket_id); + transport.setTruckLicense(result.getLicense()); + transport.setInTime(now); + transport.setInWhich(which); + transport.setState(OrderStateEnum.ENTERED.getStateid()); + transport.setFirstPic(saveImg(file)); + + // 入场的时候,就可以根据是否预付车辆,确定类型 + if (pt != null) { + transport.setType(pt.get("trans_co_id") != null ? OrderTypeEnum.SALE.getTypeid() : OrderTypeEnum.TEMP.getTypeid()); + } + + Transport finalTransport = transport; + ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = finalTransport.save() && SyncTaskService.me.save(new SyncTask().addSaveData(finalTransport)); + + return ret; + } catch (Exception e) { + return false; + } + } + }); + + result.setTransportId(transport.getId()); + result.setAccess(ret); + result.setFlow(Enums.CtrlFlowEnum.R.name()); + } else { + // TODO: 需要判断是否重复识别(车头进,倒车出去时,又将车尾车牌号识别了一遍) + + transport.setOutTime(now); + transport.setOutWhich(which); + transport.setSecondPic(saveImg(file)); + + Transport finalTransport1 = transport; + ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = finalTransport1.update() && SyncTaskService.me.save(new SyncTask().addUpdateData(finalTransport1)); + + return ret; + } catch (Exception e) { + return false; + } + } + }); + + result.setTransportId(transport.getId()); + result.setAccess(ret); + result.setFlow(Enums.CtrlFlowEnum.C.name()); + } + + if (ret) { + CliCacheData.nowLicenseMap.put(which, result.getLicense()); + CliCacheData.nowWeightMap.put(which, null); + } + + return result; + } + + /** + * 入场称重 + * + * @param transport + * @param weight + * @param which + * @return + */ + private boolean inWeigh(Transport transport, Double weight, String which) { + transport.setFirstWeight(new BigDecimal(weight)); + transport.setFirstWeightWhich(which); + + Truck truck = Truck.dao.findById(transport.getTruckLicense()); + + // 物流公司车辆 + if (truck != null) { + // 运输记录 transport 没有设置 sn,则需要根据 皮重 判断接下来怎么做 + // 订单号为 null,正常情况下是上传车牌环节查到了未完成的订单 + // 临时订单中的车辆,没有皮重数据,不会进下面的判断,临时车就不会去生成转运订单了 + Double weight_distinguish = TruckService.me.getTareDistinguish(CacheData.weight_distinguish, truck.getTare()); + + if (weight_distinguish != null) { + // 车辆入场重量大大超过皮重(>=10%)则认为是转运车辆 + // 提交的重量 减去 车辆皮重 >= 车辆皮重的 10% + // 提交的重量比皮重的 皮重 * ( 1 + 浮动参数 ) 大 + // 2019-08-01 浮动范围调整为 50% + if (weight >= weight_distinguish) { + log.debug("称重:" + weight + " >= " + weight_distinguish + " , 皮重:" + truck.getTare()); + + transport.setType(OrderTypeEnum.TRANSFER.getTypeid()); // 将运输记录设定为转运 + } + } + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = transport.update() && SyncTaskService.me.save(new SyncTask().addUpdateData(transport)); + + return ret; + } catch (Exception e) { + return false; + } + } + }); + + if (ret) { + // 只有入场时需要 + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { + Record histruck = new Record(); + histruck.set("license", transport.getTruckLicense()); + if (truck != null) { + histruck.set("trans_co_id", truck.getTransCoId()); + } + + TransportDeviceService.me.addLicenseHistory(histruck, which, TruckRodState.state_4); + } + + CliCacheData.nowWeightMap.put(which, weight); + } + + return ret; + } + + /** + * 出场称重 + * + * @param transport + * @param weight + * @param which + * @return + */ + private boolean outWeigh(Transport transport, Double weight, String which) { + transport.setSecondWeight(new BigDecimal(weight)); + transport.setSecondWeightWhich(which); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = transport.update() && SyncTaskService.me.save(new SyncTask().addUpdateData(transport)); + + return ret; + } catch (Exception e) { + return false; + } + } + }); + + if (ret) { + CliCacheData.nowWeightMap.put(which, weight); + } + + return ret; + } + + /** + * 同进同出称重 + * + * @param transport + * @param weight + * @param which + * @return + */ + private boolean commonWeigh(Transport transport, Double weight, String which) { + if (transport.getFirstWeight() == null) { + return inWeigh(transport, weight, which); + } else { + return outWeigh(transport, weight, which); + } + } + + /** + * 手动创建记录日志 + * + * @param editdata + * @param sysuser + * @return + */ + public boolean saveLog(String editdata, Sysuser sysuser) { + return ModifyLogService.me.save(Transport.tablename, "id", editdata, Enums.DataOpType.SAVE.getId(), sysuser); + } + + /** + * 手动修改记录日志,只记录修改部分 + * + * @param editdata + * @param sysuser + * @return + */ + public boolean editLog(String editdata, Sysuser sysuser) { + return ModifyLogService.me.save(Transport.tablename, "id", editdata, Enums.DataOpType.UPDATE.getId(), sysuser); + } + + /** + * 手动创建出入场记录 + * + * @param supermarket_id 超市id + * @param truck_license 车牌号 + * @param first_weight 第一次重量 + * @param second_weight 第二次重量 + * @param out_which 结算出口id,结算扫码时需要使用, + * 2020-06-24,黄州这个参数固定为 C01 + * @return + */ + public Result manualCreate(int supermarket_id, String truck_license, double first_weight, double second_weight, String out_which, Sysuser sysuser, String password) { + try { + // 重新验证密码 + Sysuser chkuser = SysuserService.me.getUserByWhere(null, sysuser.getPhone(), password); + + if (chkuser == null) { + log.debug("用户输入密码错误"); + return Result.permissionDenied(); + } + + Blacklist bl = BlacklistService.me.truckInBlacklist(truck_license); + + if (bl != null) { + return Result.failedstr("车牌【%s】在黑名单中", truck_license); + } + + Transport oldtransport = TransportService.me.undoneTransport(supermarket_id, truck_license); + + if (oldtransport != null) { + return Result.failedstr("车辆【%s】有未完成的入场记录,请先处理完毕!", truck_license); + } + + Date now = new Date(); + + Transport transport = new Transport(); + transport.setId(StrKit.getRandomUUID()); + transport.setSupermarketId(supermarket_id); + transport.setTruckLicense(truck_license); + transport.setFirstWeight(new BigDecimal(first_weight)); + transport.setFirstWeighMode(2); + transport.setInTime(now); + transport.setSecondWeight(new BigDecimal(second_weight)); + transport.setSecondWeightMode(2); + transport.setOutTime(now); + transport.setOutWhich(out_which); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + if (!AuthLicenseService.me.isAuthLicense(truck_license)) { + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(truck_license); + + authlic.save(); + } + + return transport.save() + && SyncTaskService.me.save(new SyncTask().addSaveData(transport)) + && ModifyLogService.me.save(transport, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + if (ret) { + Config.socketio.pubRefreshInSup(TransportDeviceService.me.real()); + } + + return ret ? Result.success(transport) : Result.failed("创建失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } + + /** + * 手动输入车牌入场 + * + * @param truck_license + * @param which + * @param sysuser + * @return + */ + public Result manualIn(int supermarket_id, String truck_license, String which, Sysuser sysuser) { + // 从预付费车辆中找 + // 单独用 pt 对象存储,是后面还要用是否有预付费,来判断订单类型 + // 是预付,则肯定是销售或者外销,如果有物流公司id,则肯定是销售,否是外销 + Record pt = PrepayTruckService.me.checkValidLicense(supermarket_id, truck_license); + + if (pt == null && !AuthLicenseService.me.isAuthLicense(truck_license)) { + return Result.failedstr("车牌【%s】未授权,或者第一次入场", truck_license); + } + + Transport oldtransport = TransportService.me.undoneTransport(supermarket_id, truck_license); + + if (oldtransport != null) { + return Result.failedstr("车辆【%s】有未完成的入场记录,请先处理完毕!", truck_license); + } + + Transport transport = new Transport(); + transport.setId(StrKit.getRandomUUID()); + transport.setSupermarketId(supermarket_id); + transport.setTruckLicense(truck_license); + transport.setInTime(new Date()); + transport.setInWhich(which); + transport.setState(OrderStateEnum.ENTERED.getStateid()); // 2,入场 + + // 入场的时候,就可以根据是否预付车辆,确定类型 + if (pt != null) { + transport.setType(pt.get("trans_co_id") != null ? OrderTypeEnum.SALE.getTypeid() : OrderTypeEnum.TEMP.getTypeid()); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = transport.save() && SyncTaskService.me.save(new SyncTask().addSaveData(transport)); + + if (ret) { + ret = saveLog(transport.toJson(), sysuser); + } + + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.success(transport) : Result.failed("加入失败"); + } + + /** + * 手动输入重量 + * + * @param transport_id + * @param which + * @param weight + * @param sysuser + * @param password + * @return + */ + public Result manualWeight(String transport_id, String which, double weight, Sysuser sysuser, String password) { + // 重新验证密码 + Sysuser chkuser = SysuserService.me.getUserByWhere(null, sysuser.getPhone(), password); + + if (chkuser == null) { + log.debug("用户输入密码错误"); + return Result.permissionDenied(); + } + + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("未找到有效的出入场记录"); + } + + Record logrecord = new Record(); + logrecord.set("id", transport_id); + + if (which.startsWith(Enums.CtrlFlowEnum.R.name())) { // 入场重量 + transport.setFirstWeight(new BigDecimal(weight)); + transport.setFirstWeightWhich(which); + + logrecord.set("first_weight", weight); + logrecord.set("first_weight_which", which); + } else if (which.startsWith(Enums.CtrlFlowEnum.C.name())) { // 出场重量 + transport.setSecondWeight(new BigDecimal(weight)); + transport.setSecondWeightWhich(which); + + if (transport.getOutTime() == null) { + transport.setOutTime(new Date()); + transport.setOutWhich(which); + } + + logrecord.set("second_weight", weight); + logrecord.set("second_weight_which", which); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = transport.update() && SyncTaskService.me.save(new SyncTask().addUpdateData(transport)); + + if (ret) { + ret = editLog(logrecord.toJson(), sysuser); + } + + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.success(transport) : Result.failed("修改失败"); + } + + public Result cancel(String transport_id, Sysuser sysuser) { + Transport transport = Transport.dao.findById(transport_id); + + if (transport == null) { + return Result.failed("未找到有效的出入场记录"); + } + + if (transport.getState() == OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("出场记录已完成,不能取消"); + } + + transport.setState(OrderStateEnum.INVALID.getStateid()); // 作废 + + Record logrecord = new Record(); + logrecord.set("transport_id", transport.getId()); + logrecord.set("state", OrderStateEnum.INVALID.getStateid()); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = transport.update() + && SyncTaskService.me.save(new SyncTask().addUpdateData(transport)) + && ModifyLogService.me.save(transport.tablename, "transport_id", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser); + if (ret) { + if (StrKit.notBlank(transport.getOrderSn())) { + BaseModel snorder = OrderService.me.getOrderBySn(transport.getOrderSn()); + +// if (snorder != null && snorder.getInt("state") == OrderStateEnum.LEAVE.getStateid()) { +// Bocomm bocomm = Bocomm.dao.findFirst( +// "select * from bocomm t where t.order_sn = ? and t.state <= ? limit 0,1", +// transport.getOrderSn(), +// OrderStateEnum.RECEIVED.getStateid() +// ); +// +// snorder.set("state", OrderStateEnum.INVALID.getStateid()); +// +// if (bocomm != null) { +// ret = BocommService.me.closeTran(bocomm); +// } +// +// ret = snorder.update(); +// } + } + } + + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.success(transport) : Result.failed("取消失败"); + } + + /** + * 取消前面的支付状态,重新支付 + * 只能取消 state == 4 的订单 + * + * @return + */ +// public Result backPay(String order_sn, Sysuser sysuser) { +// BaseModel snorder = OrderService.me.getOrderBySn(order_sn); +// +// if (snorder == null) { +// return Result.failed("未找到有效的订单信息"); +// } +// +// if (snorder.getInt("state") != OrderStateEnum.LEAVE.getStateid()) { +// return Result.failed("出场状态异常"); +// } +// +// Bocomm bocomm = Bocomm.dao.findFirst( +// "select * from bocomm t where t.order_sn = ? and t.state <= ? limit 0,1", +// order_sn, +// OrderStateEnum.RECEIVED.getStateid() +// ); +// +// if (bocomm == null) { +// return Result.failed("未找到有效的支付信息"); +// } +// +// Record logrecord = new Record(); +// logrecord.set("bocomm_id", bocomm.getId()); +// logrecord.set("state", OrderStateEnum.INVALID.getStateid()); +// +// boolean ret = Db.tx(new IAtom() { +// @Override +// public boolean run() { +// try { +// return BocommService.me.closeTran(bocomm) +// && ModifyLogService.me.save(bocomm.tablename, "id", logrecord.toJson(), Enums.DataOpType.UPDATE.getId(), sysuser); +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// return false; +// } +// } +// }); +// +// return ret ? Result.success(true) : Result.failed("重置错误"); +// } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transportcompany/TransportCompanyController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transportcompany/TransportCompanyController.java new file mode 100644 index 0000000..f36b923 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/transportcompany/TransportCompanyController.java @@ -0,0 +1,65 @@ +package com.cowr.local.ssjygl.transportcompany; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.TransportCompany; +import com.cowr.ssjygl.transportcompany.TransportCompanyPKValidator; +import com.cowr.ssjygl.transportcompany.TransportCompanyService; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: transport_company + * Remarks: 物流公司 + * PrimaryKey: id + */ +public class TransportCompanyController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(TransportCompanyPKValidator.class) + public void checkExistsByPk(){ + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanyService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 transport_company 物流公司 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(TransportCompanyService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 transport_company 物流公司 + */ + @Before(TransportCompanyPKValidator.class) + public void findByPk(){ + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanyService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 transport_company 物流公司 + */ + @Before(TransportCompanyPKValidator.class) + public void get(){ + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanyService.me.findByPk(model)); + } + + /** + * 返回所有 transport_company 物流公司 + */ + public void list(){ + renderJson(Result.object(TransportCompanyService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/truck/TruckController.java b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/truck/TruckController.java new file mode 100644 index 0000000..0b20127 --- /dev/null +++ b/ssjygl-xsx-local/src/main/java/com/cowr/local/ssjygl/truck/TruckController.java @@ -0,0 +1,70 @@ +package com.cowr.local.ssjygl.truck; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Truck; +import com.cowr.ssjygl.truck.TruckPKValidator; +import com.cowr.ssjygl.truck.TruckService; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: truck + * Remarks: 运输车辆信息 + * PrimaryKey: license + */ +public class TruckController extends BaseController { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(TruckPKValidator.class) + public void checkExistsByPk() { + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 truck 运输车辆信息 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String license = getUpperCaseVal("license"); + Integer trans_co_id = getInt("trans_co_id"); + Integer state = getInt("trans_co_id"); + String gps = get("gps"); + String sim = get("sim"); + Integer del = getInt("trans_co_id"); + String number = get("number"); + renderJson(Result.object(TruckService.me.find(pp, license, trans_co_id, state, gps, sim, del, number))); + } + + /** + * 按主键查找单个对象 truck 运输车辆信息 + */ + @Before(TruckPKValidator.class) + public void findByPk() { + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 truck 运输车辆信息 + */ + @Before(TruckPKValidator.class) + public void get() { + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckService.me.findByPk(model)); + } + + /** + * 返回所有 truck 运输车辆信息 + */ + public void list() { + renderJson(Result.object(TruckService.me.list())); + } +} diff --git a/ssjygl-xsx-local/src/main/resources/dev/config.properties b/ssjygl-xsx-local/src/main/resources/dev/config.properties new file mode 100644 index 0000000..371ffff --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/dev/config.properties @@ -0,0 +1,27 @@ + +devMode=true +#本地服务 和 云端服务 socket 通信 +socketserver.enable=false +#socketserver.host=47.112.109.118 +socketserver.host=127.0.0.1 +socketserver.port=21002 + +#和 web 端的 socket.io 通信端口 +socketio.port=12002 + +#当前部署本地程序的超市id +current.supermarket_id=1 + +#打印用到的配置信息 +print.vendor=湖北 +print.vendorTaxId=9142 + +#如果物流车辆入场重量大大超过皮重(>=10%),则认为是转运车辆 +#2019-08-01 暂定 50% +weight.distinguish=0.5 + +#起步运输距离 +start.trans.distance=5 + +#二维码根url +base.url=http://47.112.109.118:10001 \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/resources/dev/db.properties b/ssjygl-xsx-local/src/main/resources/dev/db.properties new file mode 100644 index 0000000..c183203 --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/dev/db.properties @@ -0,0 +1,11 @@ +# mysql +jdbcUrl=jdbc:mysql://rm-wz9wa070076b2uge2ro.mysql.rds.aliyuncs.com:3306/ssjy_xsx_dev?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true +user=ssjy_xsx +password=Ssjy_xs_890 + +# redis +redis.basekey = ssjcgl_xsx_dev +redis.ip=r-wz9168ab2f2f7ec4pd.redis.rds.aliyuncs.com +redis.port=6379 +redis.pwd=CoWR1111 +redis.db=13 \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/resources/dev/undertow.txt b/ssjygl-xsx-local/src/main/resources/dev/undertow.txt new file mode 100644 index 0000000..3f7bba9 --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/dev/undertow.txt @@ -0,0 +1,14 @@ + +undertow.devMode=true +#使用6位县级行政区划编码的后4位,开发的前面补3 +undertow.port=10002 +undertow.host=0.0.0.0 + +# 开启 gzip 压缩 +undertow.gzip.enable=true + + + + + + diff --git a/ssjygl-xsx-local/src/main/resources/job.properties b/ssjygl-xsx-local/src/main/resources/job.properties new file mode 100644 index 0000000..6c83b2e --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/job.properties @@ -0,0 +1,4 @@ +#.job 部分前面不能以 job结尾 +synctask.job=com.cowr.local.ssjygl.jobs.SyncJob +synctask.cron= 0 * * * * ? +synctask.enable=false \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/resources/log4j.properties b/ssjygl-xsx-local/src/main/resources/log4j.properties new file mode 100644 index 0000000..4cb6ea1 --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/log4j.properties @@ -0,0 +1,96 @@ +# 日志级别 +log4j.rootLogger=DEBUG, console, fileDebug, fileError +log4j.rootLogger.encoding=UTF-8 +log4j.logger.com.cowr=DEBUG +log4j.logger.com.jfinal=DEBUG +log4j.logger.io.undertow=WARN +log4j.logger.io.netty=WARN +log4j.logger.org=WARN +log4j.logger.com=WARN +log4j.logger.com.alibaba.druid=WARN +log4j.logger.net=WARN +log4j.logger.javax=WARN +log4j.logger.SYSTEM=DEBUG + +# 输出到控制台 +log4j.appender.Threshold=DEBUG +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.encoding=UTF-8 +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n +#由于使用了 undertow 运行程序,配置相对路径存放日志文件 +#若使用 tomcat 可以用 tomcat 环境变量 ${catalina.home} 作为日志文件根目录 + +# 输出到文件 debug +log4j.appender.fileDebug=org.apache.log4j.RollingFileAppender +log4j.appender.fileDebug.encoding=UTF-8 +log4j.appender.fileDebug.Append=true +log4j.appender.fileDebug.Threshold=DEBUG +log4j.appender.fileDebug.File=../logs/ssjygl.xsx.local.debug.log +log4j.appender.fileDebug.MaxFileSize=10MB +log4j.appender.fileDebug.MaxBackupIndex=1000 +log4j.appender.fileDebug.layout=org.apache.log4j.PatternLayout +log4j.appender.fileDebug.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %X{traceId}%n + +# 输出到文件 error +log4j.appender.fileError=org.apache.log4j.RollingFileAppender +log4j.appender.fileError.encoding=UTF-8 +log4j.appender.fileError.Append=true +log4j.appender.fileError.Threshold=ERROR +log4j.appender.fileError.File=../logs/ssjygl.xsx.local.error.log +log4j.appender.fileError.MaxFileSize=10MB +log4j.appender.fileError.MaxBackupIndex=100 +log4j.appender.fileError.layout=org.apache.log4j.PatternLayout +log4j.appender.fileError.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %l %m%n + +# ConversionPattern参数的格式含义 +# 格式名 含义 +# %c 输出日志信息所属的类的全名 +# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28 +# %f 输出日志信息所属的类的类名 +# %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 +# %m 输出代码中指定的信息,如log(message)中的message +# %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” +# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 +# %r 输出自应用启动到输出该日志信息所耗费的毫秒数 +# %t 输出产生该日志事件的线程名 + +# devicectrl 日志 +log4j.additivity.com.cowr.local.ssjygl.devicectrl=false +log4j.logger.com.cowr.local.ssjygl.devicectrl=DEBUG, devicectrlFile, devicectrlConsole +log4j.appender.devicectrlFile=org.apache.log4j.RollingFileAppender +log4j.appender.devicectrlFile.encoding=UTF-8 +log4j.appender.devicectrlFile.Append=true +log4j.appender.devicectrlFile.Threshold=DEBUG +log4j.appender.devicectrlFile.File=../logs/ssjygl.xsx.devicectrl.log +log4j.appender.devicectrlFile.MaxFileSize=10MB +log4j.appender.devicectrlFile.MaxBackupIndex=1000 +log4j.appender.devicectrlFile.layout=org.apache.log4j.PatternLayout +log4j.appender.devicectrlFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %F %L - %M %m %X{traceId}%n + +log4j.appender.devicectrlConsole.Threshold=DEBUG +log4j.appender.devicectrlConsole=org.apache.log4j.ConsoleAppender +log4j.appender.devicectrlConsole.encoding=UTF-8 +log4j.appender.devicectrlConsole.layout=org.apache.log4j.PatternLayout +log4j.appender.devicectrlConsole.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n + + +# nettyclient 日志 +log4j.additivity.com.cowr.local.ssjygl.netty=false +log4j.logger.com.cowr.local.ssjygl.netty=DEBUG, nettyclientFile, nettyclientConsole +log4j.appender.nettyclientFile=org.apache.log4j.RollingFileAppender +log4j.appender.nettyclientFile.encoding=UTF-8 +log4j.appender.nettyclientFile.Append=true +log4j.appender.nettyclientFile.Threshold=DEBUG +log4j.appender.nettyclientFile.File=../logs/ssjygl.xsx.nettyclient.log +log4j.appender.nettyclientFile.MaxFileSize=10MB +log4j.appender.nettyclientFile.MaxBackupIndex=1000 +log4j.appender.nettyclientFile.layout=org.apache.log4j.PatternLayout +log4j.appender.nettyclientFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %F %L - %M %m %X{traceId}%n + +log4j.appender.nettyclientConsole.Threshold=DEBUG +log4j.appender.nettyclientConsole=org.apache.log4j.ConsoleAppender +log4j.appender.nettyclientConsole.encoding=UTF-8 +log4j.appender.nettyclientConsole.layout=org.apache.log4j.PatternLayout +log4j.appender.nettyclientConsole.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n + diff --git a/ssjygl-xsx-local/src/main/resources/logging.properties b/ssjygl-xsx-local/src/main/resources/logging.properties new file mode 100644 index 0000000..91ba645 --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/logging.properties @@ -0,0 +1,13 @@ +handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +org.apache.juli.FileHandler.level = FINE +org.apache.juli.FileHandler.directory = ${log.base}/logs +org.apache.juli.FileHandler.prefix = error-debug. + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter diff --git a/ssjygl-xsx-local/src/main/resources/prod/config.properties b/ssjygl-xsx-local/src/main/resources/prod/config.properties new file mode 100644 index 0000000..1f30e05 --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/prod/config.properties @@ -0,0 +1,27 @@ + +devMode=true +#本地服务 和 云端服务 socket 通信 +socketserver.enable=false +#socketserver.host=47.112.109.118 +socketserver.host=127.0.0.1 +socketserver.port=21002 + +#和 web 端的 socket.io 通信端口 +socketio.port=12002 + +#当前部署本地程序的超市id +current.supermarket_id=1 + +#打印用到的配置信息 +print.vendor=湖北 +print.vendorTaxId=9142 + +#如果物流车辆入场重量大大超过皮重(>=10%),则认为是转运车辆 +#2019-08-01 暂定 50% +weight.distinguish=0.5 + +#起步运输距离 +start.trans.distance=5 + +#二维码根url +base.url=http://qaky.cloudowr.cn/local diff --git a/ssjygl-xsx-local/src/main/resources/prod/db.properties b/ssjygl-xsx-local/src/main/resources/prod/db.properties new file mode 100644 index 0000000..8f1b47f --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/prod/db.properties @@ -0,0 +1,11 @@ +# mysql +jdbcUrl=jdbc:mysql://rm-wz9wa070076b2uge2ro.mysql.rds.aliyuncs.com:3306/ssjy_xsx?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true +user=ssjy_xsx +password=Ssjy_xs_890 + +# redis +redis.basekey = ssjcgl_xsx +redis.ip=192.168.0.219 +redis.port=6379 +redis.pwd= +redis.db= \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/resources/prod/undertow.txt b/ssjygl-xsx-local/src/main/resources/prod/undertow.txt new file mode 100644 index 0000000..3f7bba9 --- /dev/null +++ b/ssjygl-xsx-local/src/main/resources/prod/undertow.txt @@ -0,0 +1,14 @@ + +undertow.devMode=true +#使用6位县级行政区划编码的后4位,开发的前面补3 +undertow.port=10002 +undertow.host=0.0.0.0 + +# 开启 gzip 压缩 +undertow.gzip.enable=true + + + + + + diff --git a/ssjygl-xsx-local/src/main/resources/tpl.xlsx b/ssjygl-xsx-local/src/main/resources/tpl.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b7241ec96db197097f9896e6ed4630dfefd1a505 GIT binary patch literal 12558 zcmeHtWmH_*(stwS?(QBmxHS&JB|(C_gl^p3gM0Ac?m+`Vf&_P$;1V1H1b90$bMMUL z&bz+v|9j6`r@PNOyQ=rz=c%gaRF$eC3@k1H9)Jh{0H^?72?JD~Pyj#x8~}g=K!koJ z<>&x5cK{n{dN`Sb4A|Z6?I`nMp&4@l(2()}J^l~xKtnk5NFno~oclBV<{P~i)U6>iaJ(010R5E(4L zP<78_4o#%<+BLs~mU`F}&uN?RiBmM>#tJ46ql@#|!DZd}c89UX5+%kH+e8+V0%!9p zF}X3kkU@zy?}Zw0q^SR-E|jW9u_z&ZC==!z6UHqy3xDD^2{*k$Qlc1Rb74`Z0|vz7 z(ftb7H%32%0w>~>G;?3fIDK;d)5cvv6KkJ0&=bPLi z2;uln`Hd^?%%dZO5d;<9PzvQ}aLwo$pI&QoFuh!{Q-DZ;?<}U;v_C06 zeE5KXmFO%Jb0qgEfZDF?u>6WUhIu=0{z^2mVlzLOo$kq>&_!0eFHodK-&#O7*_rU= zr2IhHYs2rjY2qs_jd;4uWAHQ<7^{}VoU?B}lT#@u>oZk1i1<8X8 z-hA!6LfY;c-=Y2Rp?hjm7;=V}4>@}$wiD{=GISvsFj+gdM*?sS?eBpg9KYps8Sh=r z_GcKyx(*zJ`8Qm(BBrA{WBk~ot95sfUHDIvL8w&X?1Pw#2s{9Q0U6nX)%xQ27_ol!umbao&*JQMkTMFib=TDA1{16j{W7#xCLG}Ka?3z%x zi`;7Rnovk36Mqj4hNae&V)w#r^!67zv4A*ax5u^oY@*p-;rSEQ)V)18Jw6K3I9Mv$esBv8lao>zmTw8wY5@T6C!lNHU? zpnB6#98%C2osl!%DJzx^==v|AkUmF&dx6SvorkiR*wp~i>@H1ssq%$f+>2#W=+Sho z=ersrejArNx%wUx-&ejc5^ZK*s&e-rJjd>uCmSBrNt=cQ@l(TaeESb@C4QV6fd*CY z597-2`Z%I>g(WQc3ygC{sT#H9`Xke*H8L+J;wu}l)(2mz70F`sD!Q_4i)|^E z#6%!S=wTW8h@oMg>d3Q9fC@;zi;{GP@%Yel%Mr`byqdctGJ|ugQY^#v_K6B}Ck*@E z+n0s2h8AS_Sp?bp$Q8ajcPR?K_pJ{mB*ukc8;BjqdT7Eq(UzEI_+P!gn1|UK~ z5dV9e_$%)J6*Hh9^bQhG{%;=@>dK0}oR}Rbk71l{nXY(P3t$fFBdtRW#K8upC3-4u z-^(=;=2ipUSw#*Q$54-xkglo?DG+fOZ0OV{u@fgThS7eq+%!e}0ViM?qmmhaubYsB;R9~R0Uqqf}z zcc|N><%;BGydvJAV9KxoSqeX<1kiSVdYjhC23Ycbi0R|fIqUG{iN)67=b1Iglm1U9 zX}P03JcJAY2=M>_gpd(`I7yI|xj7ib@!J>IPjA_fx#YYlhaGytZ?YD!-r0@K$A`Rx z15caB%_Y*|RoP#sj7q6J;FB@$wpO8zRCqvO-#j-pF~ynltX{#7?0p4umEV2S%4Mfn zpK;cS!(IP+#oDlI`48U?ul9YvyPjL8nG>=huv?D9xq<7{Q#RS%$CbwmiaDc;&9NSh zlw^^}8lmOOoFQjNw6L%ljV5J`An%;xy&)+>yQzf7W_MEZYhcQ%V)3zsRd!ZP*b=zo zPzS4Glb7o}EbNLobGLlgzKNxr64)fKSoXAG-61wT(NsPcyj0YeGj@+r?%h_5nKPH^ za%%v8eAC1-?6tfNyz`K{c^DCRq0`|A_rSaVQOzKFOLfwyrztM_0dd# zsHohOw*5&bgljYmcx}!`T!UoZS*g(9$Ca`GOVYtL|D8~2KudS*@ILd=$nsze;f|+Q z%yLBRs`2UCvD#cr55IZt{*voHEjj0UIRB=G{b?W-wxs$xta+}dVCEr1Fc>pW#|(r2 zL8#}>%n%vJ`mEaJ`l_q*X6W+bvt454Q1pS>rI*;b_x+n>hdN#GJX$R`F>-#Q-{^%{ zNSkb^WxnC0GHz1U&{e8kiv7TkM2VfSr-8b@8`G6wTZ0#dD6;6Nt%dhTR6eUo_1+gJ zS3bAkshmsOYp+L__)3Z#g|bmACkg6EL#q|P9Lq2~7r(Oct`C^zmFH+H;+8GD|f1-s&_kEuUYLjnY$X2A1Q{ zm~<(ole7bM0$xmQqU4o|_jB!2V0CLZ>Ro<2eGoxMiAVYU=JAhwot5!vy-e-H6enF5 z^XE3Z*6FK;1h;eKBQdmt#yOD;F~&sG2_~BQkrHb1AX3I+86-3etR0o!miEd=4wkPRn5oSM0qJE;VBYwD5XTo6rWB3KrB;UPLFTCg;t7ap zb7m~@Qmp>dk6WN%#2ti!J?tu1Im{r~p ztZ`Z2>ze6?jywb77$F3pOOirj+!eQ@M90(tI)q+GF4T0Q8;ZsOyjeKL@&N)ZQ?InqyP znh~c{USZL@0Y5DNAz|UnLPF2)ek%@5Nfn1Ehf1q6cn%dqn5-cR~K?7Rh$sfd7Fydnw#c`=4G5f+3S`C$+h>c;wzaZ=ocmkiauC$ov zK5Txb5AtjBKPpGDzIxr)a>=db$?WSf_ z2-5cv=hn+864hO>+NN~Ivnj=>ZC{Km$Iylf#lQlFn@GzWQ0qKtqASF9+^8ARMf`t` zpJmo2TPr*%uZS+ku%cI-nnqwDsr)%1i+a`ilFIMx)swPSqDh3WzhkNeGs+}QUu_=L zlQuP4h!6Xp6o}F~YY@HkIxv}x)aIi`h%Z+yKaq0(xen8Bk$+o9H!<~G*_wxvC*SbM zd;azdaYO#(Jl-poad3{@0vfy}GSgYX;p zBWviWf%AMB2oAs7q`KMk5d{RncMdIk#p-6n9|fp7w!Onp!BdXlH0X4uPrTI$vQ0GT zd=PuaDmsOZNAUe!uuO_yieDy)k;kTPx=^yNc2QQ;-GbHgZjAr)wsFlYsR)oqBm6ja zPG&^Brh5Qt6I$;zB}TOOzbzD?2YuTs|H?KS;iIH&%ETZJhK7cD@=SRIVs0vu_&Bk0{E-|k@$cSd z6K51#8dDiV1h6BIqojJ9SP|rIp~lMA9c_omx2oFVIu=F1;?_7XoT%%wxT(+-x~4Qi z;b;`atycHGVisSQapg9GmyQKi=Yz!tdW5F76GSoR!iwz@#?Qaa=Vy(ftF(smE>^J+ zfD1JUn1Szk$!1OBK5ll-T(6|Q%@Eht1bcnKui5I75*Fl1zVZhn{)j3`5W~;dim-Fi7c*f_4E_x z;tec`9W*2Tr+#$h4@mDcJxHrRx53m4m8Wy{I;x!$ma5M*3@H|tarl%h$|$_owz;!Z z$Y543{1K9!uD2xQPMVu{fF{1a@-S*XYCoF2anRU?B!wU?H#GH9wNoD%Q(kJd&{`A4 zq48BJJ~S>)}_`nYtk3gt$pdcdC*iNabCC098SdL5{UiyelYx5Y|RT%tovM5CNUsa zQ{IQh%tS|#5;SHsC2hlU8LOcl*%?2ei2lupMg0V8>~|snx|D9|OyNNN0KO2J1i{q=&Sy$oq_??(>la4 z9te)&_+nxKjs|+~sz12HL=q|AFpMweRcep=!0x|k+6mzRc;_Ycd}a&}RRddNiDZ{q z*QTtCu)hS1i-+PV#}k{q50gUNfmaa>+ys~lY-2klStwRclKz-o!@DTW@B2y@hyuRW zW@K=%R*pl38_{I@0Hq%Uy)|;-xGL-y2|1m?PYV+dC$Z$h0;9m?k1oz;auZ7+p!_}=wm1pgqee%iKt;p=m~wf!~L(C1+Q#t7?!MsTyW zB<&(?m{k}<4WB8Y4rmg~vcT$dnjo$K{3`jZGM-S^2$Y4We%6QnHn!Y`@BVZ5UT>?~ zYWG+U;=Q?5NY~+aD@H@+0Q`*=fgwu|Jm)9`57Z6_Utw~N;8n=x`0k0OH4zu&m-tOK zOIk*p%ABOt^W%K`Z;;O7R`RB658=_^QrnBi$s!NZJe4Pl$Qa`KrEPhjKB9Uf2bPm9 z*)7YsjCz+F(jl;8V?%Stp4)#SMQ^a~1D3-u`>Zlq zD7=H(i1MquF$A&>zAYsQd=qWKT+WX#m=qAdOzb@UelED-Ad0Swfn$`chZUirtCJgg zpI@*V`)=HjA$UV-nGSa4uB$*I%ku5WXN9%!ys`=`qt`244iyK7NpgWo+}!C!hnj*^ zZHm;Qz?_)w+E3hF)`5LIqnYb23}9o&iUZeIqeF0^{4RL*Mq`R<+d2R~!C`pElzz5q1y zI*FY-| z4h0ei-wOURPXQx$ENRRWg!>#^`2!FLknF7D)(@o0HdhEOIZ2r_H_T~4v+>eIshr%; znn!q&Nx#~|7vRcBTJ-D9OmWzXMa;mTEG~iin0CWsCLjcOIxqM6$a=%4ovQZCnz|XA zvW4ZsPTZmvww+<97vx-6Qe58!<%PUVOS9sqyjEshn?;FRfl;D5 z1cQXDNFa)Rmlt;>cJFwilOsa*T;^Yo;|$|?YsNK|EOZ7nObL`SRy_kQk9(bL7H*`u z9?@krf1Zpl?AtP960CrWnpv>%mwY!9NRDc?VVV#ySLnOe%^KMARuzflnt{F^X|9%^ z;K5igG`+3yzBe#SFb=6yyEfY1Doxe{v1U3tG3K#ei}TQftxF?DrMPby8n$Px2yTAD zg>C;zt|W4leVOY53^Sm}bizXI`t=*tK~3j;_qs1xSxq*3GN(L0o`g|XUR+a?#}@vs z@P4E$7rf<(X-b~}N3$R>EZuISh%yGusiXa>fV^U)yiIR;A=O0v@m-2K>er_Q^-Evq zg5#E|YjH%`L};2Urbd4hJWz?Go>EVWKMawE5arAD*I49Is@+hfw=4qzkG7!Eb53hC z9ECG;&Yf<0DXf-eLeaIY&+2X52B3`X4PbV!R>^Y-C08^P z+ffOZ&%T4IFHjGpTL*88T}AoQ#}>(>-Lw?_h78}UGv0+%zMg2iNzb;?L|?6|&3RMa zh-YikS3jfS*hoaG+ST$tFb%O3(RkeIrO~N#=83pH(8mhfOI)AlGJh}bPfmm@| zdE_-L0B}SO0HFOIh(TZvJ9E&_?9-9n$lE18%ua$mA;ebOE7QSRGFD8q+dDZhs>T(vu?vn|>X9{KySd*v_5aid7g2I1BI&QOaPKduv5oYHSl1F=I*Y5KAsj>g0cjxZK`SeG=Xo@_dac9JuyM|^c}-F^j?Or zyj(PY-*Ki7P9HB_ZaW3t5;xoK>?(oD3xz7CQ#7@mDJiiHrJa{wc9q}-b*tu&*2%t} z=)E@#2r1Xf%kdj`zziXJ#V;kclZ2uixGxUsLzQA;*YSS5kM(=Ht=Hw1qDF{HrEt~f z)tPU5nT|c)nZc7xTPVz1?CT|iq=00Q;w=~kYO1WSW#{WqPW`;PiEbhM?C@e?=6Q|* z*)EnrnSjdkcMOvIciut=j6KqOFqjIgy09>no}GpkPH{x9T|G#nTreuKksBJws?P%S zI8h(C2ynu&Sj^NY)m1`7`yzs2I0nE)k91?}ZeI#vNzopVBs4}bwc={-@;&{Jd($Ra z@ML|J9VQHEi8G7UnAen`$*2>c6K81b-g~m{CkKtoCMoGf68YocC-fpOnhj<3qPTrv z>F)3pqyC7Hq#6bAEwMd;8>%{kHZg{JTjU%FLe#k3NZ+>Jpel~9Ngk^LH`Eh!0KDhX zkq-;>JY$CZlNgc;7Q=E9Uu5kjHP4Qdb#C+(B{Nj_d z&Hf_P4Ev7TC`D+tuR@7~1Bpldk|T(z4K(ieuGo|{KcD=AEP0b-?qX{|f8jY-Vth5_ zH?j9B1E`}E8Wb~*|2xJFLEC558d{xwXU@7g&8!lwY81#jw(I^G7^CX z>g*Y?>b!7KCKnkf;uEk8Rw~<9cjmcsV`A$_>BVt$+U35~{QCH`&>gd=xC}#Vm$#7}Sw@ z*aZ0j)cj`t;jyn{hs|aedF-WiVHaCnn2x-(t0L{$u~TT#jLu#9>B2wcUK_j((~}-? z*Ate81Xb-OIXLsO825p;>p;P}6YZA_sMrw=W?pZ;*`UzFxBY;WYyLBXFJ%8ru^Tc= zNyuHA-)H-?-1A2U|M&XOpLzV>sz1T8-I1R-ae+55k5cYliL)W7QX2f!AGCI1Ozsxp zmr~qx1Gke`7-Z?OGzxy<5{O$p+mMz39M>Py%yO%O4JG*EaM`v3C9^v zv3F*`sHiAJe2&w_L#Yi>qkSOk@$FrxeT!5YC%UsBAK}3{cpF7BUQuRae{O`(z@gH3 z!n)<76C^02uJ?HK)`vpaq2S}F-1%6r{PVciqWN;q2Y|=t{w5NKZr9niKIpJT_FslC zu95y}2d*B&cRL{~SArCJ8GhdZC&+^Wn>%ZmgTX(a7{@QyTg+_{`ht&b+ zEiSwayl*I*cmkH(Gbnjkc$|vXK^(JS8<+_tan$@L7^qfj_H5rg1yl|~{WO;}3m&jz zuO*3)egc*qJzkcO%`_$wlx{0^e+!3yWT1~!ySNP;p#$oYz$}yn=h!+x=d$Ju<@5p< z=58_h)43@R2sIY-Lr;GfWPSet0-`M_JZ}g9G9i^eEJ)?g%+XZU+0hBaVe05?{zpI8 ze+zz)tqV^0sM5np*y~2SN_C#Ss8SxOYaIu0$;ZY9Qt}NyF3QlVn2{*B;p5};VUj57 z(BiKmEPn2iUsQdRi=JJ%nOYf~_~w%0sgtXmP)?rD7AUMrof<)WGd@^zazZ(#TSfZ< z1Si4+6Xg2!xKa*RX^Z$R*wDWTiEu1F$vA&6FQO5yXFeRsY`Ni`)blqRE^_x1bOC-e(ssl1wU#p~HF{%+^wuCH~4qvb#c=!?fyvRdbxJ3D{0_PDQe z|KQ=5&9UQ%wK_gTrr~hZr7Wr-{%vG4wzzHk&@|YO#r7gzB?*oQAvjbN&6^lqK6N6_ zWzPfD%-2GzbtZ@|H>PFma@Od)xGF|?tu{hqAhw4p9~K{nwdpSQZP>hTL zygVu+$|tlj>tG;~hu)Y21RNHb3I2uOHB)A-Lcof*eS7N#9GuS$Y-HE0!VpKG>_P4;n@(7+Jd=*@Hgj7@}VDL z+{fV@2wyJa@18wAZrsEcmmj)?j}-3L@LyZ@`$X+-f5~ACPQ7#uGigtPICv)6@_dU!=p^K>l4B8r4WY-kHD{9B)gthtufZ+qKjHZ<<&h5tf@eR-32CbR ziwkxEfgSDt3+aCW8UT1VK5Wy&i3vCEllMf~kb1@FU_v7_?OL~=A5yeHBCi6QVn(}Q z&-ie|d>QYP+Czr!7V5YfFI9!{ zah3bLuOz2I3K47*|NiCY)Z*SDyym-zYBM1w^6Jc?ppkXwhIcUq7> zX_q|j^sRb?1nA#=Arv$lgkAn~OZJ~z_4}`XXwX(w{JVm`H;DdKK|RF5{-s^?SHWM~ ziM+|ewF^a jkNvB(7Rz6xP5>!@)=hgoJ3jjy- literal 0 HcmV?d00001 diff --git a/ssjygl-xsx-local/src/main/resources/tpl_完整版.xlsx b/ssjygl-xsx-local/src/main/resources/tpl_完整版.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0a0c338a26b8abbf715ca7511249754ff077c6f9 GIT binary patch literal 13793 zcmeHu1#=u}vTX}3Sz?K04UHeLbf(e#x_p6 z%5HYXj@tCD)>eeM;GmS*0MPgA|GWJk_CR_3m`yJuqR4&16GBWA8k3WP3Ywn?!5BL9 z69{=GDSDW-8{|iytuVLZQddfUncU?}j~~(|+_+U~Tp9xWdsgI-=DMVMjzy7lELS|w zM?BxaB{V85Oo>o%_?hrGw%|;05R&cc2c(sSUqvLxY0OXyCj$;LdV@rfe1a9-6Bv}C zuWPn^Vq5CK6W!-6LT4`FJ~ot7x#`|qFOICM$F$o_H55xzURcJ_800w^-|>l0p#_Zy zw0W*nJB9Q5&Z>jRD;4o#k_S^E+8a>rE139Vw+Xmt6yRb->Kk+O+MQ59olhQ@JKO92 z`s_aglvd7`Td@1#pgl%_f$n&Se(V-gSrA4hiDP`Wd5`7I9l_iQ$<8+W9V3Y0f$#?t z@XD)8aV56*>Acn2=Py-4S zivxC~#^f`i+kO@O=X#fL$c=;yh8Qi!Pu?_+;PiVCTu<+$e0u`}$p0HVQ8_i>fKk-81T zNbWsT4UgfZ+7vtTdS%u7g#N-uE|O3uQS8^81~x)l!|G5IE!pEBP)u4C$pir#eU?oxL7uZE)=ba1 ztTnS4U~?Cvyf*e6FL>^MZdX$UvY1LbY7|0UJPzxVC15d_Qaw3%?{*4AvE`440?DLi zV$Gd6TwhM~h!*aIM=d`9Br|f?lc}$`WgJxzJ1A&W{f((r1Yl_w#^(|YNar{W3lVj; zpKH_*b#l=Jb2I&kij-tm#AjRe3N-vE$wNV&xDFG3On-brZT2rdZFMN2rS?s>>zSy9 z5Rny#o712|OM$X$>xr48eCWR%;Dr@%K}mM5q~=gj94lD?GqV+OAM!c#z~qAxsKW^; zA_~ehaI|r3)-TvKtqo^aze0z7W)STotWc$a2ERx#n+g8n3;98betAH$6~3f2I=?yv zc^FAJZ7%{RvA~QV(V?di2gyNMyQ887U^#sgz^f0pApKy z13A#16jq6h$%;}6j7#hJPI01PxlhZ#H$(31%LH0LFQ}Ja6(e#gFpQUk+{J=SkyU!o z-?De85%sGGD~{#MS5B1E5o@PCi^A`|Ek5T@>Zr1KXyI;8Vamj7|mlf|PeQRU}mWt89Mh5JVfi zEpJ47gM6X7x}?>68&@~ff)7F@x@Mb06HO`?NO5yolArWN^j`ak2M40Sz@A& zE)vJ*rPkj_PjEq{kBt93HE+4PA=RJyg zx3!ctaiJj6pV(hhci7@K7z8*_srzNmdl)19i+N^V@L*rxi^6}#z8`OV(#?C!x4y?e zHUJ9bJ@)@uG5*Sc|EV4z??Ue#<^T3pt|%kb&xqIo^BThFlIDztwBp1-e5P`W05wui zwMI_F;(fb?L*1&az9_{2W*h8wF)`$P{|SB<4CSterZ^lK+#SX0;xmNp#LWa4l)-rg zzP}g*3i8>>Y1ugpe5xZ#3vcW&Z6+$m_XkQctdP7yV&U7C*2O@ygbCI@dVLTf)Ev;5r%W^S;cCAi_-05eDPL^KaQB0r(7+kctJ zxJ_F2*ChTDztlyS*^k9~oNM zdjF^YGi0`s+c^SY004U?008s-ihrd`M>At%Cr5^Vd@%iyH|xKAaa`kq_ufi*LBQ`? zY9w6?`(!`afBmw`X?@RK78Pq|@kK{Ng5mS?76zd}3^69f#EA3i@(Z{xAwMEuKgN%>7)sKV;1{2`|?B#nhqn&HiP|N6TyK z+O{Z!l*)o|$L?f_Abb~-Ev@KWs5V+I@+=v5dqg|&Vh{8+ZHrxQh&#*{V$OT%_DhA0 zBSBF}Ydqrjs+gFKje<3!WNU)^ksP4lwGjqJ_S-QLPiB1m%g;}{KkZ-7uO9T%&Z7x; zEnB6&WeJ*fG;RggJqslc>AEmp5a@i~T=d?*Tnh2=!xr7P%J*uWs8e!QW94^HIvFq8 zvizBP)fnG@_(sj7)0RRZN5v)o?Ru*)c8SXPQB(a=RDVMeGnEE`U~bL(g^%v(285UA z*UT*6eBIk(RaHONW3sL;-rn=RlAH*lxxlLlRl#<%)Nml14?Gx%!sKv4SYDvh6T zE2jL*f*s&E@Tj)mZmGgz@qj+P9FI+y*qw=~M0vBb^ZK;CpyWjTkk#G}qW1x*7& zU7KYzXH#d-tP&RlALYr-oVo*>A^X;{`u6LC1`tkI+u@@cCY%{LA2imAFbAq#_Xu`x z+E7o}=^6ODe_kmYd0>k#SM7tiz~DcS;#X}PJ#{-#dm8{;F-#wO`uw}JuU*KVQhiGLMQ-~|u}{Eh5kKt2Jp>HGe81JZ5+~TEj+J#?A=EkMd{A_7 zI|^bkxsAWLlq%W&rZsAa?@3gtvnN7-S(To2e1y>wU!>n+(bOWd9RE#2_?(e`_q2@r zStptiID0Q(54HHIYOXFkH9&Q zuGA$!(OeC=n;#T|4k@`D@2wr49mePya#wUCv>cy)eHvuGuf&>(CIqtPf3 zOXxeS2BQ%b(iVehjlr-cF;C68U!+u0k8nzk*VZwM{^8Wh73b%^QH5a95;P&HZq|C? zU*8mubA($FdslBWN{_|JBAH*3iBN*2v6u~q(}`eG!D&ksvs6_w&|;46>Jr7%R&$n!4E{5kNd+Gk9$!B?~!8w1knaT1M9ae+c zXaM*rtv}cd6dhU~y*(O70ce+}SppX3T4=bIxI`)epn6+D#EjMJ$cn;bCg-db6q=GH z1=UeHk(S7i6xYOAEsyscl(4#m5K4sAU^1F;+C=PaqM=PVpY~QN&&e*0BUQAIHI5gL zb)p8*3qhX=eH9?r4~~GI;WQyenv=+n;!HdzN$qQ~cGQ`rykNkrH5v{lvJ3-v*S3b* z;q^Cu<>eI=P$7`$uM!SRkS3Ox1G&qLCe5AkSPLaG40HNgnTBW}94pMdtTbA4wjmn} zUY(nzVyZJ6FKaLyOGFb~4vi#}ukL{(*c?|qwhgf;l6U`9s*a{2sN7{kFI2{ihbWoi*gR4HU;Lk8TZ71(nf!fV509*B=B5`7jp*Ba2;p3;dlzD>>>_feKob!}^wLFt3TB zF+A+T5t~&|%+_={7M{x?hOXYB3;F1uh>xtwxK)KsJf|gmTgJf>lSz?epC0>#xiaLW zg`IerBy#JNG-j2l!@|l-FeXyvT=OvTq6VFxc#u&V4hr+2nepgyB;}dR0uMNTWSht{ zX`tkmf}@RaWhI9W!`8*hQIHq*#X?%8g@s{$s#hJwiA;R=(GahO##RW#^&(vbx7W1( zVCprL?q0TbPSJElgbF+Srx;nG*oz=W5@MF|qy1i5yrau*X(8~GSHdGtZ1*5lsZTg8 za4~4(q57@1sCj*+%j{htQ^jv=Qk?$dicy5ti$wVNlI#`;NJgTtmJbyD>S35%l#DL| zz+(i_26@RNq$F^a-GD41N>LWxOrEgrK3tPioxG*Wba0{OH=7S4MGz(w`x?-CgpeUO z1}q@Urf9-*JRa%-!r#s5LI%NAPB=X9(L(p+G9n1!DK83JJ zLgUlBF5bM^Pu)>$j(4 zg=pX_IO`QkxvXsQIf`$u;dcUZFJ;2bJ^ZOnQ&jKqkhUJxaD;9tKU$)M#GrrMiL=0Job;{L&foJhq5eUBUIZQFPq-j1z`dFn-hH-4mJ zE+*n(S{0sW6=4Y_a`)f}ZHMwjb3s-+ijzl{Gb$wWr75l43Z-wHN@hFTwFodt5tbt2 zZMnH$`zN)!w!q2eZ?6*yu&z z97=B=dZNIsF`I~9SwtMUD9qliKrdQWm`|*b8Fij zxf>pn#H4mLp)@=loLPZCU@GhCkq_??d^ z1YUD+Omr>it^k=09|_W`Cr-(GVngO+e8M&y;@k3o z;_JDV7mf4FR+jK0F)~n-B81QBalRkJCi+m@1J2c5j_%t`&u10aM$Hc^1%Y58FyaZp zGNxvFsVLh&kGcw~J?44f#3|t7vp9^ZU`krQUP`N@fp^6YC?vO^FsYlNjefuazzeCD zEEEja&1zCEg>b_VKHJB-VUDbxZ9jt{gct7p$@E2DX^jV`g@l7hYA>3`3qMJAmzgcZqW}&HTe5<5 z!Fqo5FT-22S{MB~=~<>j_JJN58I&dZ+PW8)MQ6w>2!&vbO;&wo`&4~^m(1k@G3{=u zqF)h7FNcM5SUhhk9mpvi#|wF|#rLnzkT|6Dij=Jvdo59%48&@W-Xwz(-xpE}?UA1S z)0@K>%4rp=Gw90g;z&F(M`}m z3R6;7%MO0d&D)GlpVpxW+!0zQ1K)V+&J)NmjhYye+zQPpEl1MT+vv6_KRJyT_m^g2 zNhv&4<|1m7BIXszitMTBW$8BeA7GtK+x|-7q;GqZI7^5A1H&&3Rg*6iqe`KX^pXzG;@UFv&huwV0#@A-p+yObYvtmyl71yw^Dx_PsYzDr&B z^D&zroN=v_HY+>Egv@1@txe&OrW}GzM{Vk zUhGzpZ@g+4Bbb}ejs(YF<(`VI(pe)C!h(*zF6&LBjG=fc0~?E1Is@wGI7%ohnMKy8 zJuY?&c9NaX$TFISW@8El_Km2x$|1fjtXTL8rZ4#8!D@Do{4XlHL z_iYtIEYEzUJH8Vy4xgl7XS#6$8MUp`URrm?<~WT5z(o~Q`B z_qL*V>kXQB-ctFKA4)6^lq7?y!50S2u~<+;x-Zce3`^-Vq2{(8626dp4@k))&9L9A zrQ_r^qd6RkWP=b1Ddm|MHF}_xkOuRN3uv7~r;A1+t*O!Hh?-XBIt!O!5PfTHu*17e z{A^6Y4du9YSj_dS2gj-#*c0K_k;fuuUbd8}Rs0AS6)B%loqR>gr=SYGnYR0sObccB z&DxqQ`?3Z!OM`*B1tr@CEL{2SmVEzYs1hjsX){gTONX=zerpjs3!60>a0RasHhggm z@h|wFr#V*A*pgXk*4z#@&Rd!k>>5*DT1i@f1wMsyJb5)@6Dc&4BLht?S*9$`Hu^)0 z1F}no7UHXWRHbWqJKrMgBOci!ce~^-C-FJl(csITr6oLIy)dHkw(0utU4*W`9AeKN z@cnHeuG(;f{Po_w1K|Y#;Qm>N9i7~)j2-`2Haq(wW4p$N*@>|1gXrXPt3TENHzu;t z&+li0nFza_kVutQER2nuv5M!uWkrHLTNca6hSs5mqq)#vMcpXn&U7qjBjh?AJ zAw$zvBmR_-Qk!}wk?8K~t zSZ{>N*-PH9OWFl~2A2zg6&baNY1nDuaiB898qdC<6e+b1+9)kekD-uQEtM zcsbbzCWICFt8Ebu6<_eL&{9}X31L#fyzQj+Rz`HuXHo~hER@YoJ_SLHi#bA;b3lhD zN2}9V*2*4K*vdFl;5+xQ0TJ=;Dxq~(+I?}!z;a;P2Vj(bd{}`5MLOakW7?@9wz?_N#EL zFGvRRsjQOV(^1YH-lm`lPCi#Sp_GDj6(L2`BCbIyWK0F-HTWQ^DJi_Vw+U`IVy;sz zj{de5WWr(@d?HkRR&REIIDS%}SUeI$0Irk7wQT>1gG@S@3fI0Cz4<7=Q@FUGts{~- z18+!ryWH8Lnp4#b7kChyG-SdOq*lB4!rN z58H+r|1YxzQac)0@r$LJt|QzRwGhwJiiOB+Z0LPT<~le6i#uC1Y8lEOmj|`VQjvGQ zl?s}kH=89vf1+LsF5%RzxaL>y7>NBC)5v2nMqQ%iRM#vyQryz2U`EsU^SopX54Iw$ zoKtQUV#sqx&vw`Is^@q&M5#NrSfKxSnd^`?)OKNO;IW^l&^fiLy?_3=YHAr8j;yKF#dG3CbWjlZ9|7_ernV5p4k zp<21;)!OlYn;j%6{Ixc5yKwnrQs@GC;xv8ywPpqjd+s!9#^ZBGXC|DAw%0SKz3zR) zT5Hdp0S9^cooFYRi+hJz4bsD!R~i+Cj^KM^g~K2eb6sWWS9dSgBiJYH zJQfz#m)5PcO-vRNzYR*aGBp)ex^@EEZX6O>tusXI8|v@!wP?xURdTd~VVpT<7dCRQ z?@wj_*=R{!p8Iz8-k0-uAI3ucSD7%=cQ7_ma&j=YG5tri7+0N;UE@dWR6F^s?qMq} z9z-cQ4gy`06fX1(P&EiGSeEU8OvuC~70+g3k`x4oQxT8{rUonjBIO4~5OTK8at(^I zE}rklwQw&s*0>%&Yud9l?X>s24v5!B2S@uBp3Xlr3}pb$S&}d8M(?-Tk>Sl0g;{>( z5I#j&3*`R>DjK(bV`?Aq3373i!*4b%WTPK{sHPog*uVm$=)rx`|JHC(>e41qn@H?w(Y+$_wSyUnFmW;4?E9FV9ircdL z=?q!nvH@zIFg&`b?eb~3$p`byk(#T7HGpGdYA!Ahg!2A~!Y)xxP@;RqKtLN2acFv! z(^?BGNTB=-=hl)Unf`Q}(lw^eio<=9uZmxqy$K-33JRPz4^28!{M`KVKS1FsgW^@5F z(`J*8f$j@yZ^PE$Smb=N zB_{Qc=h{ZPozAw02R%2NofTN#m^5vFkjO1B&b)R_b2s!>Ki$FTP8$U->N-yKPJ!LO zHyi(x9iOe4rF!03A^6^rCiy2j{^(i%s}1?jCib7r$bYo31EYJwdl^wh?!jJ#Ts`6z zgJ6Y}*om7}4#5nbRw37tfcK~`9(B0J-3JGDQwMBm&)g+ACh#$|^R1vk`-T{1)t4Tt zbX@{994G6j&~)5D{W<#1R4`dt$*>`yIvPw(kOJuoW}kQeN=+1W36S^uibR+jFb#&S8=BYhMF_ zQC{d`8qLALfbo{YM;>;itVvs21ts^K#ffish()_TwZ(ty;=Jc7~ zIg+ppm|DqSlTBEiZ2L`dK5NAyS&^eB_3>H@D2C(5^CqSfWWkYUE^2; zF=3qA2B_UuU%_17pn^TECiGq#vO2;>BR2O9cE8`>-vq&Q)UliIdjO=pr%9yu@dYDW zLwN^VJ4XgXTL&1YT?~=p0QoBeTE~J}8*O{xbQsxz`2>>R)Kw-qtiQ2Bj z(Eczhq2tNk-d@O)!QSxx-e-UpY{c0;MGwECVCk8g$T+)Hs9Z-k)PZ%(=qd^DW3c4I-Lx?gi3o9*sP<9y0&KtZc~%XuD0@x_!0sa(=p?$X&}dD z^mDBy+&Fs58yRFj1y7dMVE&Ll+#)^7E4Z-A(Zv?k6ZqeSEh-x!N$MYyG++P#;$Op7 z-_Gv8QTqqg|GA~d_Q>M=F{zmF1W&VtVha$VyvA1HPXJRPA+uxOT4QDSsY<1nU-6 zBTu4MDby#~L29%J2XXZ~%{A5rIugjo`=yP(thA!FEdRL8$<*4m)rtu}Tviz6Gx|kH zx)0E8fh+;&yGsVSps!%A(-1b8n(OF?SFf)-_t8aVr!Jur1;^FwKTQX{z8xNnXHfJ)s#V=EawXWpxzF(VBIv1tVHJVyL!WnR)+~#&iGP>3_9N`y z#q(3*D;wB*Jo~)w@9zoxB@KUdbh5SnZ%F@7Km!2j(_HU=c0 z=bdYhbAt+3a3o~G6OBk$tSMjasc&PvlKSxAU4m^lC!o*|0-PKDSxFEnY0~F^s`o6t zz*i7K)il)-WT>EVmjT%C&f$E1+9>i`pz#x16>n1wmh^Lk#xZ*hD_SWrbJ#v5i~982 zVAjiLpwua_8Hf(^pgV?6W*xe9I?-o6` z3Tp%_msN^y{A24VXQv77n`$v2f} z@b5G4e+8&}Pq2TPfdAd__sQQsO~1cus^8{-e>eX3(aAqe0f60ix%R&gQvQzf`#jyB zNNDe5``@PPenH + + + Archetype Created Web Application + diff --git a/ssjygl-xsx-local/src/main/webapp/index.html b/ssjygl-xsx-local/src/main/webapp/index.html new file mode 100644 index 0000000..ca66a5f --- /dev/null +++ b/ssjygl-xsx-local/src/main/webapp/index.html @@ -0,0 +1,98 @@ + + + + + Demo Chat + + + + + + + + + + + +

Netty-socketio Demo Chat

+
+
+
+
+ + + +
+ + \ No newline at end of file diff --git a/ssjygl-xsx-local/src/main/webapp/index.jsp b/ssjygl-xsx-local/src/main/webapp/index.jsp new file mode 100644 index 0000000..c38169b --- /dev/null +++ b/ssjygl-xsx-local/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/ssjygl-xsx-local/start.bat b/ssjygl-xsx-local/start.bat new file mode 100644 index 0000000..ddca547 --- /dev/null +++ b/ssjygl-xsx-local/start.bat @@ -0,0 +1,40 @@ +@echo off + +chcp 65001 + +rem ------------------------------------------------------------------------- +rem +rem 使用说明: +rem +rem 1: 该脚本用于别的项目时只需要修改 MAIN_CLASS 即可运行 +rem +rem 2: JAVA_OPTS 可通过 -D 传入 undertow.port 与 undertow.host 这类参数覆盖 +rem 配置文件中的相同值此外还有 undertow.resourcePath, undertow.ioThreads +rem undertow.workerThreads 共五个参数可通过 -D 进行传入 +rem +rem 3: JAVA_OPTS 可传入标准的 java 命令行参数,例如 -Xms256m -Xmx1024m 这类常用参数 +rem +rem +rem ------------------------------------------------------------------------- + +setlocal & pushd + + +rem 启动入口类,该脚本文件用于别的项目时要改这里 +set MAIN_CLASS=com.cowr.local.ssjygl.main.Main + +rem 项目中有 undertow.txt 配置文件的,可从配置文件中读取 undertow 的启动参数,可以不用 JAVA_OPTS +rem Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格 +rem set "JAVA_OPTS=-Xms256m -Xmx1024m -Dundertow.port=9080 -Dundertow.host=0.0.0.0" +rem set "JAVA_OPTS=-Dundertow.port=9080 -Dundertow.host=0.0.0.0" + +set APP_BASE_PATH=%~dp0 +set CP=%APP_BASE_PATH%config;%APP_BASE_PATH%lib\* +java -Xverify:none %JAVA_OPTS% -cp %CP% %MAIN_CLASS% + + +endlocal & popd +pause + + + diff --git a/ssjygl-xsx-local/start.sh b/ssjygl-xsx-local/start.sh new file mode 100644 index 0000000..107bbcf --- /dev/null +++ b/ssjygl-xsx-local/start.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# --------------------------------------------------------------------------- +# +# 使用说明: +# +# 1: 该脚本用于别的项目时只需要修改 MAIN_CLASS 即可运行 +# +# 2: JAVA_OPTS 可通过 -D 传入 undertow.port 与 undertow.host 这类参数覆盖 +# 配置文件中的相同值此外还有 undertow.resourcePath、undertow.ioThreads、 +# undertow.workerThreads 共五个参数可通过 -D 进行传入,该功能尽可能减少了 +# 修改 undertow 配置文件的必要性 +# +# 3: JAVA_OPTS 可传入标准的 java 命令行参数,例如 -Xms256m -Xmx1024m 这类常用参数 +# +# 4: 脚本最后一部分给出了 4 种启动项目的命令行,根据注释中的提示自行选择合适的方式 +# +# --------------------------------------------------------------------------- + +# 启动入口类,该脚本文件用于别的项目时要改这里 +MAIN_CLASS=com.cowr.local.ssjygl.main.Main + +# 项目中有 undertow.txt 配置文件的,可从配置文件中读取 undertow 的启动参数,可以不用 JAVA_OPTS +# Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格 +# JAVA_OPTS="-Xms256m -Xmx1024m -Dundertow.port=9080 -Dundertow.host=0.0.0.0" +# JAVA_OPTS="-Dundertow.port=9081 -Dundertow.host=0.0.0.0" + +# 生成 class path 值 +APP_BASE_PATH=$(cd `dirname $0`; pwd) +CP=${APP_BASE_PATH}/config:${APP_BASE_PATH}/lib/* + +# TODO debug 时可以将所有控制台日志输出到 output.log 会很大 +# 运行为后台进程,并在控制台输出信息 +# java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} > output.log + +# 运行为后台进程,并且不在控制台输出信息 +# nohup java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} >/dev/null 2>&1 & + +# 运行为后台进程,并且将信息输出到 output.log 文件 +# nohup java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} > output.log & + +# 运行为非后台进程,多用于开发阶段,快捷键 ctrl + c 可停止服务 +/home/admin123456/hsjygl_hzq/jdk1.8.0_251/bin/java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} +#java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} + + + + + + + diff --git a/ssjygl-xsx-service/build.sh b/ssjygl-xsx-service/build.sh new file mode 100644 index 0000000..3e9e4d4 --- /dev/null +++ b/ssjygl-xsx-service/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +git pull +mvn clean package +./target/ssjygl-xsx-service-release/ssjygl-service/start.sh + + + diff --git a/ssjygl-xsx-service/debug.sh b/ssjygl-xsx-service/debug.sh new file mode 100644 index 0000000..009f243 --- /dev/null +++ b/ssjygl-xsx-service/debug.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +./target/ssjygl-xsx-service-release/ssjygl-service/start.sh + + + diff --git a/ssjygl-xsx-service/package.xml b/ssjygl-xsx-service/package.xml new file mode 100644 index 0000000..a308f47 --- /dev/null +++ b/ssjygl-xsx-service/package.xml @@ -0,0 +1,63 @@ + + + + + release + + + + dir + + + + + + true + + + + + ${basedir}/src/main/resources + config + + + + + ${basedir}/src/main/webapp + webapp + + + + + ${basedir} + + + 755 + + *.sh + *.bat + + + + + + + + lib + + + + + + + diff --git a/ssjygl-xsx-service/pom.xml b/ssjygl-xsx-service/pom.xml new file mode 100644 index 0000000..5cba5f6 --- /dev/null +++ b/ssjygl-xsx-service/pom.xml @@ -0,0 +1,207 @@ + + + + + 4.0.0 + + com.cowr.ssjygl-xsx-service + ssjygl-xsx-service + 1.0 + jar + + 砂石经营管理-浠水县-云端服务 + http://www.example.com + + + UTF-8 + 1.8 + 1.8 + + + + + + ali-maven + http://maven.aliyun.com/nexus/content/groups/public + + true + + + true + always + fail + + + + + + + com.cowr.ssjygl-xsx-common + ssjygl-xsx-common + 1.0 + compile + + + + com.jfinal + jfinal + 4.9 + + + + com.jfinal + cos + 2020.4 + + + + com.jfinal + jfinal-undertow + 2.1 + + + + mysql + mysql-connector-java + 8.0.16 + + + + com.alibaba + druid + 1.1.22 + + + + com.alibaba + fastjson + 1.2.71 + + + + eu.bitwalker + UserAgentUtils + 1.21 + + + + log4j + log4j + 1.2.16 + + + + io.netty + netty-all + 4.1.48.Final + + + + org.quartz-scheduler + quartz + 2.3.2 + + + + de.ruedigermoeller + fst + 2.56 + + + + redis.clients + jedis + 2.9.0 + + + + org.apache.poi + poi-ooxml + 4.1.0 + + + + org.apache.poi + poi-ooxml-schemas + 4.1.0 + + + + org.apache.poi + ooxml-schemas + 1.4 + + + + + org.slf4j + slf4j-nop + 1.7.25 + + compile + + + + + + ssjygl-xsx-service + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + UTF-8 + + -parameters + + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + make-assembly + package + + single + + + + + ${project.artifactId} + + false + + true + + + package.xml + + + ${project.build.directory}/ + + + + + + + + diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/authlicense/AuthLicenseSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/authlicense/AuthLicenseSyncService.java new file mode 100644 index 0000000..23b2965 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/authlicense/AuthLicenseSyncService.java @@ -0,0 +1,163 @@ +package com.cowr.service.ssjygl.authlicense; + +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.utils.StrUtil; +import com.cowr.model.AuthLicense; +import com.cowr.model.Blacklist; +import com.cowr.model.SyncTask; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Fri May 01 23:24:53 CST 2020 + * TableName: auth_license + * Remarks: 出入控制 - 授权车辆 + * PrimaryKey: truck_license + */ +public class AuthLicenseSyncService extends BaseService { + public static AuthLicenseSyncService me = new AuthLicenseSyncService(); + private static Log log = Log.getLog(AuthLicenseSyncService.class); + + /** + * 加到定时任务里面 + */ + public void init() { + clear(); +// update(); + } + + + /** + * TODO: 需要测试 + * 将物流公司有效车辆,且不在 auth_license 里面的车辆加进去,将外销、采购车辆中的车牌不在 auth_license 中的车牌加进去 + *

+ * 1.系统启动时执行一次 + * 2.系统运行时,定时任务每天凌晨执行一次 + */ + public void update() { + List inserts = new ArrayList<>(); + SyncTask synctask = new SyncTask(); + + // 检查物流公司车辆 + List vls = AuthLicense.dao.find("select t.license truck_license from truck t \n" + + " left join auth_license v on t.license = v.truck_license \n" + + " where t.state = 1 \n" + // 不是黑名单中的车辆 + " and v.truck_license is null "); + + if (vls != null && !vls.isEmpty()) { + inserts.addAll(vls); + } + + // 检查已完成的临时订单 + vls = AuthLicense.dao.find("select t.truck_license from transport t \n" + + " left join auth_license v on t.truck_license = v.truck_license \n" + + " where t.state = ? \n" + + " and v.truck_license is null ", OrderStateEnum.RECEIVED.getStateid()); + + if (vls != null && !vls.isEmpty()) { + inserts.addAll(vls); + } + + if (vls != null && !vls.isEmpty()) { + inserts.addAll(vls); + } + + if (!inserts.isEmpty()) { + for(AuthLicense authlic : inserts){ + synctask.addSaveData(authlic); + } + + Db.tx(new IAtom() { + @Override + public boolean run() { + try { + Db.batchSave(inserts, inserts.size()); + + log.debug("auth_license 插入[" + inserts.size() + "]条"); + + SyncTaskService.me.save(synctask); + + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + } + } + + /** + * TODO: 需要测试 + * 从 auth_license 里面清除掉标记未和名单的车辆,避免其他地方操作失败导致标记为黑名单的车辆还在 auth_license 里面 + * 1.系统启动时执行一次 + * 2.系统运行时,定时任务每天凌晨执行一次 + */ + public void clear() { + Double cnt = Db.queryDouble("select count(*) cnt from blacklist t where t.remove_user_id is null"); + + if (cnt == null) { + log.debug("没有有效的和名单"); + return; + } + + Db.tx(new IAtom() { + @Override + public boolean run() { + try { + SyncTask synctask = new SyncTask(); + int size = 500; + int page = Math.round(cnt.floatValue() / size); + for (int p = 0; p < page; p++) { + int start = size * p; + int end = p + 1; + + List blacklist = Blacklist.dao.find( + "select * from blacklist t where t.remove_user_id is null limit " + start + ", " + end); + String sql = "select * from auth_license t where t.license in("; + + List paraList = new ArrayList<>(); + List paraSql = new ArrayList<>(); + for (Blacklist bl : blacklist) { + paraList.add(bl.getTruckLicense()); + paraSql.add("?"); + } + + List list = AuthLicense.dao.find(sql + StrUtil.join(paraSql, ",") + ")", paraList.toArray()); + + if (list != null && !list.isEmpty()) { + log.debug("发现[" + list.size() + "]个在黑名单中的车辆需要清理"); + String delsql = "delete from auth_license where truck_license in("; + List paraDelList = new ArrayList<>(); + List paraDelSql = new ArrayList<>(); + + for (AuthLicense bl : list) { + paraDelList.add(bl.getTruckLicense()); + paraDelSql.add("?"); + + synctask.addDeleteData(bl); + } + + int ret = Db.delete(delsql + StrUtil.join(paraDelSql, ",") + ")", paraDelList.toArray()); + log.debug("清理[" + ret + "]条车辆记录"); + + SyncTaskService.me.save(synctask); + } + } + + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + } + +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/base/BaseSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/base/BaseSyncService.java new file mode 100644 index 0000000..d1fb277 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/base/BaseSyncService.java @@ -0,0 +1,148 @@ +package com.cowr.service.ssjygl.base; + +import com.cowr.common.base.BaseModel; +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.Enums; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.Result; +import com.cowr.model.SyncTask; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; + +import java.util.Arrays; + +public class BaseSyncService extends BaseService { + private static Log log = Log.getLog(BaseSyncService.class); + + public Result save(BaseModel model, Sysuser sysuser, String... columns) { + if (model.checkDuplicate(columns)) { + return Result.failed(false, StrUtil.join(Arrays.asList(columns), ",") + " 数据重复"); + } else { + return save(model, sysuser); + } + } + + /** + * 新增 + * + * @param model BaseModel + * @return Result + */ + public Result save(BaseModel model, Sysuser sysuser) { + try { + // 注意这里,按主键未找到才做 save 操作 + if (model.checkExistsByPk()) { + return Result.failed(false, "主键冲突"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return model.save() + && SyncTaskService.me.save(new SyncTask().addSaveData(model)) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 删除 + * + * @param model BaseModel + * @return Result + */ + public Result delete(BaseModel model, Sysuser sysuser) { + try { + // 如果存在逻辑删除字段 del,则只做逻辑删除,不做物理删除 + if (model.hasDelKey()) { + return logicDel(model, sysuser); + } + + // 注意这里有 !,找到后才做 delete 操作 + if (!model.checkExistsByPk()) { + return Result.failed(false, "按主键未找到对应记录"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return model.delete() + && SyncTaskService.me.save(new SyncTask().addDeleteData(model)) + && ModifyLogService.me.save(model, (BaseModel) model.findByPk(), Enums.DataOpType.DELETE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return Result.object(ret); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + /** + * 修改 + * + * @param model BaseModel + * @return Result + */ + public Result update(BaseModel model, Sysuser sysuser) { + try { + // 注意这里有 !,找到后才做 update 操作 + BaseModel oldobj = (BaseModel) model.findByPk(); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return model.update() + && SyncTaskService.me.save(new SyncTask().addUpdateData(model)) + && ModifyLogService.me.save(model, oldobj, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + // 将修改后的对象返回 + String[] keys = model._getAttrNames(); + for (String key : keys) { + oldobj.set(key, model.get(key)); + } + + return ret ? Result.object(oldobj) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "修改失败"); + } + } + +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistController.java new file mode 100644 index 0000000..e3f3908 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistController.java @@ -0,0 +1,97 @@ +package com.cowr.service.ssjygl.blacklist; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Blacklist; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.blacklist.BlacklistPKValidator; +import com.cowr.ssjygl.blacklist.BlacklistService; +import com.cowr.ssjygl.blacklist.BlacklistValidator; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: blacklist + * Remarks: 基础配置 - 车辆黑名单 + * PrimaryKey: id + */ +public class BlacklistController extends BaseController { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(BlacklistPKValidator.class) + public void checkExistsByPk(){ + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistService.me.checkExistsByPk(model)); + } + + /** + * 新增 blacklist 基础配置 - 车辆黑名单 + */ + @Before(BlacklistValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistSyncService.me.save(model, tokenuser)); + } + + /** + * 分页查找 blacklist 基础配置 - 车辆黑名单 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String truck_license = getUpperCaseVal("truck_license"); + renderJson(Result.object(BlacklistService.me.find(pp, truck_license))); + } + + /** + * 按主键查找单个对象 blacklist 基础配置 - 车辆黑名单 + */ + @Before(BlacklistPKValidator.class) + public void findByPk(){ + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistSyncService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 blacklist 基础配置 - 车辆黑名单 + */ + @Before(BlacklistPKValidator.class) + public void get(){ + Blacklist model = getModel(Blacklist.class, "", true); // 忽略不在model中的字段 + renderJson(BlacklistSyncService.me.findByPk(model)); + } + + /** + * 返回所有 blacklist 基础配置 - 车辆黑名单 + */ + public void list(){ + renderJson(Result.object(BlacklistService.me.list())); + } + + + @Before(BlacklistPKValidator.class) + public void remove(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String id = get("id"); + renderJson(BlacklistSyncService.me.remove(id, tokenuser)); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistSyncService.java new file mode 100644 index 0000000..13ea5d9 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/blacklist/BlacklistSyncService.java @@ -0,0 +1,146 @@ +package com.cowr.service.ssjygl.blacklist; + +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +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 BlacklistSyncService extends BaseSyncService { + public static BlacklistSyncService me = new BlacklistSyncService(); + private static Log log = Log.getLog(BlacklistSyncService.class); + + public Result save(Blacklist model, Sysuser sysuser) { + try { + Blacklist oldmodel = Blacklist.dao.findFirst("select * from blacklist t \n" + + " where t.remove_user_id is null \n" + + " and t.truck_license = ? ", model.getTruckLicense()); + + if(oldmodel != null){ + return Result.failed("【" + model.getTruckLicense() + "】还在黑名单中,未移除"); + } + + model.setId(StrKit.getRandomUUID()); + model.setSetTime(new Date()); + model.setSetUserId(sysuser.getId()); + + SyncTask synctask = new SyncTask(); + synctask.addSaveData(model); + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(model.getTruckLicense()); + synctask.addDeleteData(authlic); // 加入黑名单时,要删除有效车牌 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.save(); + + if (ret) { + Truck truck = Truck.dao.findById(model.getTruckLicense()); + + if (truck != null) { + Truck oldtruck = truck.clone(); + truck.setState(2); // 若是物流公司车辆,标记为已入黑名单 + + synctask.addUpdateData(truck); + + ret = truck.update() + && ModifyLogService.me.save(truck, oldtruck, Enums.DataOpType.UPDATE.getId(), sysuser); + } + } + + return ret + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 从黑名单中移除 + * 标记为移除,记录不删除 + * @param id + * @param sysuser + * @return + */ + public Result remove(String id, Sysuser sysuser) { + Blacklist model = Blacklist.dao.findById(id); + if (model == null) { + return Result.failed("按 id 未找到记录"); + } + + try { + model.setRemoveTime(new Date()); + model.setRemoveUserId(sysuser.getId()); + + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(model); + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(model.getTruckLicense()); + synctask.addSaveData(authlic); // 移除黑名单时,要添加有效车牌 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.update(); + + if (ret) { + Truck truck = Truck.dao.findById(model.getTruckLicense()); + + if (truck != null) { + Truck oldtruck = truck.clone(); + truck.setState(1); // 若是物流公司车辆,标记为移出黑名单 + + synctask.addUpdateData(truck); + + ret = truck.update() + && ModifyLogService.me.save(truck, oldtruck, Enums.DataOpType.UPDATE.getId(), sysuser); + } + } + + return ret + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, null, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java new file mode 100644 index 0000000..ddc4939 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/cache/CacheController.java @@ -0,0 +1,26 @@ +package com.cowr.service.ssjygl.cache; + +import com.cowr.common.view.Result; +import com.cowr.service.ssjygl.main.AuthInterceptor; +import com.cowr.service.ssjygl.supermarket.SupermarketSyncService; +import com.cowr.ssjygl.transportcompany.TransportCompanyService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.aop.Clear; +import com.jfinal.core.Controller; + +@Clear(AuthInterceptor.class) +public class CacheController extends Controller { + /** + * 重新加载本地数据库缓存到内存 + */ + public void reload(){ + SupermarketSyncService.me.initSupCache(); + + TransportCompanyService.me.initTransCoPriceModulus(); // 初始化物流公司价格系数配置 + TransPriceService.me.initTransPriceConfigSale(); // 初始化销售订单运输价格配置 + TransPriceService.me.initTransPriceConfigTransfer(); // 初始出转运订单运输价格配置 + TransPriceService.me.initTransPriceConfigTrash(); // 初始出废料订单运输价格配置 + + renderJson(Result.success("重新加载完成")); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java new file mode 100644 index 0000000..b2a46b0 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerController.java @@ -0,0 +1,133 @@ +package com.cowr.service.ssjygl.customer; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Customer; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.customer.CustomerPKValidator; +import com.cowr.ssjygl.customer.CustomerService; +import com.cowr.ssjygl.customer.CustomerValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: customer + * Remarks: 客户 + * PrimaryKey: id + */ +public class CustomerController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(CustomerPKValidator.class) + public void checkExistsByPk(){ + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerService.me.checkExistsByPk(model)); + } + + /** + * 新增 customer 客户 + */ + @Before(CustomerValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 customer 客户 + */ + @Before(CustomerPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 customer 客户 + */ + @Before(CustomerPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 customer 客户 + */ + @Before(CustomerValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 customer 客户 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + Integer type = getInt("type"); + renderJson(Result.object(CustomerService.me.find(pp, name, del, type))); + } + + /** + * 按主键查找单个对象 customer 客户 + */ + @Before(CustomerPKValidator.class) + public void findByPk(){ + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 customer 客户 + */ + @Before(CustomerPKValidator.class) + public void get(){ + Customer model = getModel(Customer.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerService.me.findByPk(model)); + } + + /** + * 返回所有 customer 客户 + */ + public void list(){ + renderJson(Result.object(CustomerService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerSyncService.java new file mode 100644 index 0000000..e3726d9 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/CustomerSyncService.java @@ -0,0 +1,7 @@ +package com.cowr.service.ssjygl.customer; + +import com.cowr.service.ssjygl.base.BaseSyncService; + +public class CustomerSyncService extends BaseSyncService { + public static CustomerSyncService me = new CustomerSyncService(); +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactController.java new file mode 100644 index 0000000..84f6a2b --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactController.java @@ -0,0 +1,135 @@ +package com.cowr.service.ssjygl.customer.contact; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerContact; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.customer.contact.CustomerContactPKValidator; +import com.cowr.ssjygl.customer.contact.CustomerContactService; +import com.cowr.ssjygl.customer.contact.CustomerContactValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_contact + * Remarks: 客户相关 - 客户联系人 + * PrimaryKey: id + */ +public class CustomerContactController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(CustomerContactPKValidator.class) + public void checkExistsByPk(){ + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactService.me.checkExistsByPk(model)); + } + + /** + * 新增 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 customer_contact 客户相关 - 客户联系人 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer customer_id = getInt("customer_id"); + Integer del = getInt("del"); + String name = get("name"); + String phone = get("phone"); + renderJson(Result.object(CustomerContactService.me.find(pp, customer_id, name, phone, del))); + } + + /** + * 按主键查找单个对象 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactPKValidator.class) + public void findByPk(){ + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 customer_contact 客户相关 - 客户联系人 + */ + @Before(CustomerContactPKValidator.class) + public void get(){ + CustomerContact model = getModel(CustomerContact.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerContactService.me.findByPk(model)); + } + + /** + * 返回所有 customer_contact 客户相关 - 客户联系人 + */ + public void list(){ + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(CustomerContactService.me.list(customer_id))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactSyncService.java new file mode 100644 index 0000000..e777460 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/contact/CustomerContactSyncService.java @@ -0,0 +1,31 @@ +package com.cowr.service.ssjygl.customer.contact; + +import com.cowr.common.view.Result; +import com.cowr.model.Customer; +import com.cowr.model.CustomerContact; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.base.BaseSyncService; + +public class CustomerContactSyncService extends BaseSyncService { + public static CustomerContactSyncService me = new CustomerContactSyncService(); + + public Result save(CustomerContact model, Sysuser sysuser) { + Customer customer = Customer.dao.findById(model.getCustomerId()); + + if(customer == null){ + return Result.failed("未找到对应的客户信息"); + } + + return super.save(model, sysuser); + } + + public Result update(CustomerContact model, Sysuser sysuser) { + Customer customer = Customer.dao.findById(model.getCustomerId()); + + if(customer == null){ + return Result.failed("未找到对应的客户信息"); + } + + return super.update(model, sysuser); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverController.java new file mode 100644 index 0000000..1e24495 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverController.java @@ -0,0 +1,138 @@ +package com.cowr.service.ssjygl.customer.receiver; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.CustomerReceiver; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.customer.receiver.CustomerReceiverPKValidator; +import com.cowr.ssjygl.customer.receiver.CustomerReceiverService; +import com.cowr.ssjygl.customer.receiver.CustomerReceiverValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sun Apr 12 21:56:13 CST 2020 + * TableName: customer_receiver + * Remarks: 客户相关 - 客户收获地址 + * PrimaryKey: id + */ +public class CustomerReceiverController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(CustomerReceiverPKValidator.class) + public void checkExistsByPk() { + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverService.me.checkExistsByPk(model)); + } + + /** + * 新增 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverValidator.class) + public void save() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverSyncService.me.save(model)); + } + + /** + * 删除 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverPKValidator.class) + public void del() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverPKValidator.class) + public void restore() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverValidator.class) + public void edit() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 customer_receiver 客户相关 - 客户收获地址 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + Integer customer_id = getInt("customer_id"); + String name = get("name"); + Integer supermarket_id = getInt("supermarket_id"); + String phone = get("phone"); + renderJson(Result.object(CustomerReceiverService.me.find(pp, customer_id, name, phone, supermarket_id))); + } + + /** + * 按主键查找单个对象 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverPKValidator.class) + public void findByPk() { + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 customer_receiver 客户相关 - 客户收获地址 + */ + @Before(CustomerReceiverPKValidator.class) + public void get() { + CustomerReceiver model = getModel(CustomerReceiver.class, "", true); // 忽略不在model中的字段 + renderJson(CustomerReceiverService.me.findByPk(model)); + } + + /** + * 返回所有 customer_receiver 客户相关 - 客户收获地址 + */ + public void list() { + Integer customer_id = getInt("customer_id"); + String name = get("name"); + Integer supermarket_id = getInt("supermarket_id"); + String phone = get("phone"); + renderJson(Result.object(CustomerReceiverService.me.list(customer_id, name, phone, supermarket_id))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverSyncService.java new file mode 100644 index 0000000..bfdc51c --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/customer/receiver/CustomerReceiverSyncService.java @@ -0,0 +1,31 @@ +package com.cowr.service.ssjygl.customer.receiver; + +import com.cowr.common.view.Result; +import com.cowr.model.Customer; +import com.cowr.model.CustomerReceiver; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.base.BaseSyncService; + +public class CustomerReceiverSyncService extends BaseSyncService { + public static CustomerReceiverSyncService me = new CustomerReceiverSyncService(); + + public Result save(CustomerReceiver model, Sysuser sysuser) { + Customer customer = Customer.dao.findById(model.getCustomerId()); + + if(customer == null){ + return Result.failed("未找到对应的客户信息"); + } + + return super.save(model, sysuser); + } + + public Result update(CustomerReceiver model, Sysuser sysuser) { + Customer customer = Customer.dao.findById(model.getCustomerId()); + + if(customer == null){ + return Result.failed("未找到对应的客户信息"); + } + + return super.update(model, sysuser); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverController.java new file mode 100644 index 0000000..b3fc6e3 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverController.java @@ -0,0 +1,134 @@ +package com.cowr.service.ssjygl.driver; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Driver; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.driver.DriverPKValidator; +import com.cowr.ssjygl.driver.DriverService; +import com.cowr.ssjygl.driver.DriverValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: driver + * Remarks: 司机信息 + * PrimaryKey: id + */ +public class DriverController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(DriverPKValidator.class) + public void checkExistsByPk(){ + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverService.me.checkExistsByPk(model)); + } + + /** + * 新增 driver 司机信息 + */ + @Before(DriverValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 driver 司机信息 + */ + @Before(DriverPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 driver 司机信息 + */ + @Before(DriverPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 driver 司机信息 + */ + @Before(DriverValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 driver 司机信息 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + String phone = get("name"); + Integer trans_co_id = getInt("trans_co_id"); + Integer del = getInt("del"); + renderJson(Result.object(DriverService.me.find(pp, name, phone, trans_co_id, del))); + } + + /** + * 按主键查找单个对象 driver 司机信息 + */ + @Before(DriverPKValidator.class) + public void findByPk(){ + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 driver 司机信息 + */ + @Before(DriverPKValidator.class) + public void get(){ + Driver model = getModel(Driver.class, "", true); // 忽略不在model中的字段 + renderJson(DriverService.me.findByPk(model)); + } + + /** + * 返回所有 driver 司机信息 + */ + public void list(){ + renderJson(Result.object(DriverService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverSyncService.java new file mode 100644 index 0000000..ea99c58 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/driver/DriverSyncService.java @@ -0,0 +1,33 @@ +package com.cowr.service.ssjygl.driver; + +import com.cowr.common.view.Result; +import com.cowr.model.Driver; +import com.cowr.model.Sysuser; +import com.cowr.model.TransportCompany; +import com.cowr.service.ssjygl.base.BaseSyncService; + +public class DriverSyncService extends BaseSyncService { + public static DriverSyncService me = new DriverSyncService(); + + public Result save(Driver model, Sysuser sysuser) { + int trans_co_id = model.getTransCoId(); + TransportCompany tco = TransportCompany.dao.findById(trans_co_id); + + if(tco == null){ + return Result.failed("未找到对应物流公司信息"); + } + + return super.save(model, sysuser); + } + + public Result update(Driver model, Sysuser sysuser) { + int trans_co_id = model.getTransCoId(); + TransportCompany tco = TransportCompany.dao.findById(trans_co_id); + + if(tco == null){ + return Result.failed("未找到对应物流公司信息"); + } + + return super.update(model, sysuser); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/SyncJob.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/SyncJob.java new file mode 100644 index 0000000..610dcb2 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/jobs/SyncJob.java @@ -0,0 +1,15 @@ +package com.cowr.service.ssjygl.jobs; + +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.jfinal.log.Log; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +public class SyncJob implements Job { + private static Log log = Log.getLog(SyncJob.class); + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + SyncTaskService.me.task(); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java new file mode 100644 index 0000000..4c91c35 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/AuthInterceptor.java @@ -0,0 +1,56 @@ +package com.cowr.service.ssjygl.main; + +import com.cowr.common.view.Result; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.jfinal.aop.Interceptor; +import com.jfinal.aop.Invocation; +import com.jfinal.core.Controller; +import com.jfinal.log.Log; + +public class AuthInterceptor implements Interceptor { + private static Log log = Log.getLog(AuthInterceptor.class); + private String ENV; + + public AuthInterceptor(String ENV) { + this.ENV = ENV; + } + + @Override + public void intercept(Invocation inv) { + try { + if ("dev".equals(this.ENV)) { + inv.invoke(); + } else { + Controller c = inv.getController(); + String token = c.get("token"); + + //避免有提交文件的获取不到 token + if (token == null) { + try { + c.getFile(); + } catch (Exception ignored) { + + } + } + + if (token == null) { + c.renderJson(Result.noauth()); + return; + } + + Sysuser sysuser = SysuserService.me.getSysuserByToken(token); + + if (sysuser == null) { + c.renderJson(Result.noauth()); + return; + } + + inv.invoke(); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + inv.getController().renderJson(Result.failedstr("服务端异常: %s", e.getMessage() )); + } + } +} 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 new file mode 100644 index 0000000..f529326 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Config.java @@ -0,0 +1,298 @@ +package com.cowr.service.ssjygl.main; + +import com.alibaba.druid.filter.stat.StatFilter; +import com.alibaba.druid.wall.WallFilter; +import com.cowr.common.ctrl.HomeController; +import com.cowr.service.ssjygl.blacklist.BlacklistController; +import com.cowr.service.ssjygl.cache.CacheController; +import com.cowr.service.ssjygl.customer.CustomerController; +import com.cowr.service.ssjygl.customer.contact.CustomerContactController; +import com.cowr.service.ssjygl.customer.receiver.CustomerReceiverController; +import com.cowr.service.ssjygl.driver.DriverController; +import com.cowr.service.ssjygl.netty.NettyServer; +import com.cowr.service.ssjygl.order.ordercluster.OrderclusterController; +import com.cowr.service.ssjygl.order.orderpurchase.OrderPurchaseController; +import com.cowr.service.ssjygl.order.ordersale.OrderSaleController; +import com.cowr.service.ssjygl.order.ordertemp.OrderTempController; +import com.cowr.service.ssjygl.order.ordertransfer.OrderTransferController; +import com.cowr.service.ssjygl.order.ordertrash.OrderTrashController; +import com.cowr.service.ssjygl.prepay.prepaydetail.PrepayDetailController; +import com.cowr.service.ssjygl.prepay.prepaytruck.PrepayTruckController; +import com.cowr.service.ssjygl.prepay.refunddetail.RefundDetailController; +import com.cowr.service.ssjygl.product.ProductController; +import com.cowr.service.ssjygl.purchase.PurchaseController; +import com.cowr.service.ssjygl.sandfarm.SandfarmController; +import com.cowr.service.ssjygl.supermarket.SupermarketController; +import com.cowr.service.ssjygl.supermarket.SupermarketSyncService; +import com.cowr.service.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistanceController; +import com.cowr.service.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistanceController; +import com.cowr.service.ssjygl.supermarket.stock.StockController; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.cowr.service.ssjygl.system.sysuser.SysuserController; +import com.cowr.service.ssjygl.transportcompany.TransportCompanyController; +import com.cowr.service.ssjygl.truck.TruckController; +import com.cowr.ssjygl.CacheData; +import com.cowr.common.Const; +import com.cowr.common.plugin.QuartzPlugin; +import com.cowr.ssjygl.cctv.CctvController; +import com.cowr.ssjygl.prepay.PrepayController; +import com.cowr.ssjygl.stat.purchase.OrderPurchaseStatController; +import com.cowr.ssjygl.stat.sale.OrderStatController; +import com.cowr.ssjygl.stat.transfer.OrderTransferStatController; +import com.cowr.ssjygl.transportcompany.TransportCompanyService; +import com.cowr.ssjygl.transprice.TransPriceService; +import com.jfinal.config.*; +import com.jfinal.json.FastJsonFactory; +import com.jfinal.kit.PathKit; +import com.jfinal.kit.Prop; +import com.jfinal.kit.PropKit; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.ActiveRecordPlugin; +import com.jfinal.plugin.activerecord.SqlReporter; +import com.jfinal.plugin.activerecord.dialect.MysqlDialect; +import com.jfinal.plugin.druid.DruidPlugin; +import com.jfinal.plugin.redis.RedisPlugin; +import com.jfinal.template.Engine; +import com.cowr.common.Interceptor.ReporterInterceptor; +import com.cowr.common.handler.GlobalHandler; +import com.cowr.common.view.JsonRenderFactory; +import com.cowr.model._MappingKit; + +import java.sql.Connection; + +public class Config extends JFinalConfig { + private static Log log = Log.getLog(Config.class); + public static String ENV = "dev"; + public static Prop configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); + public static Prop dbprop = PropKit.use(ENV + "/db.properties", "UTF-8"); + private WallFilter wallFilter; + public static NettyServer nettyServer = null; + private static boolean server_run = true; + + private class ServerThread extends Thread { + @Override + public void run() { + try { + while (server_run) { + nettyServer = new NettyServer(configprop.getInt("socketserver.port")); + nettyServer.start(); + + try { + Thread.sleep(1000); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } + + private void initPropConfig() { + dbprop = PropKit.use(ENV + "/db.properties"); + configprop = PropKit.use(ENV + "/config.properties", "UTF-8"); + + CacheData.print_vendor = configprop.get("print.vendor"); + CacheData.print_vendorTaxId = configprop.get("print.vendorTaxId"); + + try { + String start = configprop.get("start.trans.distance"); + + if (StrKit.isBlank(start)) { + log.error("读取运费起步运距错误"); + return; + } + + CacheData.start_trans_distance = Double.valueOf(start); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + @Override + public void configConstant(Constants me) { + initPropConfig(); + + me.setJsonFactory(FastJsonFactory.me()); + me.setDevMode(false); + me.setRenderFactory(new JsonRenderFactory()); + me.setMaxPostSize(1024 * 1024 * 100); // 100 M + } + + @Override + public void configRoute(Routes me) { + me.add("/", HomeController.class); + me.add("/cache", CacheController.class); + me.add("/supcctv", CctvController.class); + + // -- 权限系统 + me.add("/sysuser", SysuserController.class); + + // -- 基础信息 + me.add("/sandfarm", SandfarmController.class); + me.add("/supermarket", SupermarketController.class); + me.add("/supermarket/ssd", SupermarketSandfarmDistanceController.class); + me.add("/supermarket/srd", SupermarketReceiverDistanceController.class); + me.add("/purchase", PurchaseController.class); + me.add("/product", ProductController.class); + me.add("/stock", StockController.class); + + // -- 物流公司相关 + me.add("/transCo", TransportCompanyController.class); + me.add("/truck", TruckController.class); + me.add("/driver", DriverController.class); + me.add("/blacklist", BlacklistController.class); + + // -- 客户相关 + me.add("/customer", CustomerController.class); + me.add("/customer/contact", CustomerContactController.class); + me.add("/customer/receiver", CustomerReceiverController.class); + + // -- 预付费 + me.add("/prepay", PrepayController.class); + me.add("/prepaydetail", PrepayDetailController.class); + me.add("/prepaytruck", PrepayTruckController.class); + me.add("/refunddetail", RefundDetailController.class); + + // -- 订单相关 + me.add("/order/ordercluster", OrderclusterController.class); + me.add("/order/sale", OrderSaleController.class); + me.add("/order/temp", OrderTempController.class); + me.add("/order/transfer", OrderTransferController.class); + me.add("/order/trash", OrderTrashController.class); + me.add("/order/purchase", OrderPurchaseController.class); + + // -- 统计 + me.add("/stat/sale", OrderStatController.class); + me.add("/stat/transfer", OrderTransferStatController.class); + me.add("/stat/purchase", OrderPurchaseStatController.class); + } + + @Override + public void configEngine(Engine me) { + + } + + @Override + public void configPlugin(Plugins me) { + boolean devMode = configprop.getBoolean("devMode", false); + boolean isprod = "prod".equals(ENV); + + SqlReporter.setLog(devMode); + + { + DruidPlugin druidPlugin = new DruidPlugin(dbprop.get("jdbcUrl"), dbprop.get("user"), dbprop.get("password").trim()); + wallFilter = new WallFilter(); // 加强数据库安全 + wallFilter.setDbType("mysql"); + druidPlugin.addFilter(wallFilter); + druidPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据 + me.add(druidPlugin); + + ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); + arp.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED); + _MappingKit.mapping(arp); + arp.setDialect(new MysqlDialect()); + me.add(arp); + arp.setShowSql(true); + } + + me.add(new QuartzPlugin()); + + if (isprod) { + RedisPlugin redis = new RedisPlugin( + com.cowr.common.Const.REDIS_CACHENAME, + dbprop.get("redis.ip"), + dbprop.getInt("redis.port"), + 0 + ); + + me.add(redis); + } else { + me.add(new RedisPlugin( + Const.REDIS_CACHENAME, + dbprop.get("redis.ip"), + dbprop.getInt("redis.port"), + 0, + dbprop.get("redis.pwd"), + dbprop.getInt("redis.db") + )); + } + } + + + @Override + public void configInterceptor(Interceptors me) { + me.add(new AuthInterceptor(ENV)); + + boolean devMode = configprop.getBoolean("devMode", false); + if (devMode) { + me.add(new ReporterInterceptor()); + } + } + + @Override + public void configHandler(Handlers me) { + // 让 druid 允许在 sql 中使用 union + // https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter + wallFilter.getConfig().setSelectUnionCheck(false); + me.add(new GlobalHandler()); + } + + public void onStart() { + try { + SupermarketSyncService.me.initSupCache(); + + TransportCompanyService.me.initTransCoPriceModulus(); // 初始化物流公司价格系数配置 + TransPriceService.me.initTransPriceConfigSale(); // 初始化销售订单运输价格配置 + TransPriceService.me.initTransPriceConfigTransfer(); // 初始出转运订单运输价格配置 + TransPriceService.me.initTransPriceConfigTrash(); // 初始出废料订单运输价格配置 + + CacheData.service_enable = configprop.getBoolean("socketserver.enable", false); + + if (SyncTaskService.me.isEnable()) { + new ServerThread().start(); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + public void onStop() { + server_run = false; + + if (nettyServer != null) { + nettyServer.stop(); + } + } + + /** + * 判断当前是 开发 环境,还是 生产 环境 + * 根据不同的环境变量读取不同数据库连接 + * + * @return + */ + public static boolean isProd() { + String OS = System.getProperty("os.name").toLowerCase(); + // 简单粗暴的判断,在 linux 环境下运行时,为生成环境 + if (OS.contains("linux")) { + // 根据 Linux 上的运行目录,判断当前连接那个数据库 + // 这边将 生产 环境运行目录写死,只有在这个目录下运行时,才算 生产 环境 + String path = PathKit.getWebRootPath(); + String linux_dev_dir = "/home/admin123456/ssjygl_hzq/ssjygl-service-release"; + + log.debug("path:" + path); + + if (linux_dev_dir.equals(path)) { + ENV = "prod"; + + return true; + } else { + return false; + } + } else { + return false; + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java new file mode 100644 index 0000000..e8f9103 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/Main.java @@ -0,0 +1,34 @@ +package com.cowr.service.ssjygl.main; + +import com.jfinal.kit.PathKit; +import com.jfinal.log.Log; +import com.jfinal.server.undertow.UndertowServer; + +public class Main { + private static Log log = Log.getLog(Main.class); + + public static void main(String[] args) { + log.info("========= 启动云端服务 ================"); + + boolean isprod = Config.isProd(); + String path = PathKit.getWebRootPath(); + + if (isprod) { + log.info("===================================================="); + log.info("========= production environment ================"); + log.info("===================================================="); + log.info("Running directory: " + path); + + // 相关配置见 undertow.txt + UndertowServer.create(Config.class, Config.ENV + "/undertow.txt").start(); + } else { + log.info("===================================================="); + log.info("========= development environment ==============="); + log.info("===================================================="); + log.info("Running directory: " + path); + + // 相关配置见 undertow.txt + UndertowServer.create(Config.class, Config.ENV + "/undertow.txt").start(); + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/SvrCacheData.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/SvrCacheData.java new file mode 100644 index 0000000..2634354 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/main/SvrCacheData.java @@ -0,0 +1,10 @@ +package com.cowr.service.ssjygl.main; + +import com.cowr.model.Supermarket; + +import java.util.HashMap; +import java.util.Map; + +public class SvrCacheData { + public static Map SUP_CACHE = new HashMap<>(); // 超市基础信息缓存,常用配置数据,避免重复请求数据库 +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java new file mode 100644 index 0000000..3f32918 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/netty/NettyServer.java @@ -0,0 +1,256 @@ +package com.cowr.service.ssjygl.netty; + +import com.alibaba.fastjson.JSONObject; +import com.cowr.common.enums.Enums; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.jfinal.log.Log; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LineBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.util.CharsetUtil; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class NettyServer { + private static final ThreadLocal sdf = new ThreadLocal() { + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + } + }; + + private static Log log = Log.getLog(NettyServer.class); + private static final Map map = new HashMap<>(); + + private int port; + private ServerBootstrap serverBootstrap; + private EventLoopGroup workerGroup; + private EventLoopGroup bossGroup; + private static boolean debuglog = false; + + public NettyServer(int port) { + this.port = port; + } + + public void showDebugLog() { + debuglog = true; + } + + public void hideDebugLog() { + debuglog = false; + } + + /** + * 控制台输出,调试用 + * + * @param msg + */ + private static void printlog(String msg) { + if (debuglog) { + System.out.println(sdf.get().format(new Date()) + " " + msg); + } + } + + public void start() { + log.debug("启动 socket 服务"); + + bossGroup = new NioEventLoopGroup(); + workerGroup = new NioEventLoopGroup(); + try { + serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast( + new IdleStateHandler(5, 5, 5), // 处理心跳包 + new StringEncoder(CharsetUtil.UTF_8), + new LineBasedFrameDecoder(4096), // 处理粘包问题 + new StringDecoder(CharsetUtil.UTF_8), + new MsgHandler() + ); + } + }) + .option(ChannelOption.SO_BACKLOG, 128) + .childOption(ChannelOption.SO_KEEPALIVE, true); + + ChannelFuture f = serverBootstrap.bind(port); + f.sync(); + f.channel().closeFuture().sync(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } + + public void stop() { + log.debug("停止 socket 服务"); + + if (serverBootstrap != null) { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + serverBootstrap = null; + } + } + + public boolean send(int supermarket_id, String msg) { + Channel channel = null; + synchronized (map) { + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().equals(supermarket_id)) { + channel = entry.getKey(); + break; + } + } + } + + if (channel == null) { + return false; + } else { + channel.write(msg); + channel.writeAndFlush("\n"); + + return true; + } + } + + private static class MsgHandler extends SimpleChannelInboundHandler { + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + log.debug("channelActive from " + ctx.channel().remoteAddress().toString()); + map.put(ctx.channel(), 0); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.debug("客户端掉线 " + ctx.channel().remoteAddress().toString() + ", supermarket_id = " + map.get(ctx.channel())); + map.remove(ctx.channel()); + super.channelInactive(ctx); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + if (!validateMsg(msg)) { + sendMsg(ctx, deny().toJSONString()); + } + + JSONObject json = JSONObject.parseObject(msg); + String target = json.getString("target"); + + if (Enums.MsgTarget.LOGIN.name().equals(target)) { + int supermarket_id = json.getIntValue("supermarket_id"); + Channel o = null; + + synchronized (map) { + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().equals(supermarket_id)) { + o = entry.getKey(); + break; + } + } + } + + // TODO 这里是把旧的挤下去? + if (o != null) { + try { + o.close(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + map.remove(o); + } + + map.put(ctx.channel(), supermarket_id); + + sendMsg(ctx, new JSONObject() + .fluentPut("target", Enums.MsgTarget.valueOf(target)) + .fluentPut("code", 200) + .toJSONString() + ); + + log.debug("supermarket_id " + supermarket_id + " 注册成功"); + } else if (Enums.MsgTarget.HEARTBEAT.name().equals(target)) { + printlog("收到心跳 supermarket " + map.get(ctx.channel()) + ", 已连接客户端总数: " + map.size()); + } else if (Enums.MsgTarget.SYNCTASK.name().equals(target)) { + JSONObject data = json.getJSONObject("data"); + boolean ret = SyncTaskService.me.recv(data, map.get(ctx.channel())); + + // 接收成功后,返回id + if (ret) { + sendMsg(ctx, new JSONObject() + .fluentPut("target", Enums.MsgTarget.SYNCRECV) + .fluentPut("id", data.get("id")) + .toJSONString()); + } + } else if (Enums.MsgTarget.SYNCRECV.name().equals(target)) { + SyncTaskService.me.syncComplete(json.getString("id")); + } else { + System.out.println(json); + } + + } + + void sendMsg(ChannelHandlerContext ctx, String msg) { + ctx.channel().write(msg); + ctx.channel().writeAndFlush("\n"); + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + if (evt instanceof IdleStateEvent) { + IdleState state = ((IdleStateEvent) evt).state(); + if (state == IdleState.WRITER_IDLE) { + // write heartbeat to server + JSONObject json = new JSONObject(); + json.put("target", Enums.MsgTarget.HEARTBEATREPLY); + + ctx.channel().write(json.toJSONString()); + ctx.channel().writeAndFlush("\n"); + + printlog("回复心跳 supermarket " + map.get(ctx.channel())); + } + } else { + super.userEventTriggered(ctx, evt); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + log.debug("客户端连接错误 supermarket " + map.get(ctx.channel()) + ",已连接客户端总数: " + map.size(), cause); + ctx.close(); + } + + JSONObject deny() { + return new JSONObject().fluentPut("target", "deny"); + } + + boolean validateMsg(String msg) { + try { + JSONObject obj = JSONObject.parseObject(msg); + + if (obj == null) { + return false; + } + + return obj.containsKey("target"); + }catch (Exception e){ + return false; + } + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java new file mode 100644 index 0000000..baab1c9 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterController.java @@ -0,0 +1,112 @@ +package com.cowr.service.ssjygl.order.ordercluster; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Ordercluster; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.order.ordercluster.OrderclusterPKValidator; +import com.cowr.ssjygl.order.ordercluster.OrderclusterService; +import com.cowr.ssjygl.order.ordercluster.OrderclusterValidator; +import com.jfinal.aop.Before; + +public class OrderclusterController extends BaseController { + + + /** + * 新增 ordercluster 订单簇 - 集团客户订单 + */ + @Before(OrderclusterValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Ordercluster model = getModel(Ordercluster.class, "", true); // 忽略不在model中的字段 + renderJson(OrderclusterSyncService.me.save(model, tokenuser)); + } + + /** + * 修改 ordercluster 订单簇 - 集团客户订单 + */ + @Before(OrderclusterEditValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Ordercluster model = getModel(Ordercluster.class, "", true); // 忽略不在model中的字段 + renderJson(OrderclusterSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 ordercluster 订单簇 - 集团客户订单 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String customer_name = get("customer_name"); + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_id = getInt("customer_id"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer trans_co_id = getInt("trans_co_id"); + renderJson(Result.object(OrderclusterService.me.find(pp, supermarket_id, trans_co_id, customer_id, customer_name, stm, etm, product_id, state))); + } + + public void findChildren() { + PageParam pp = getBean(PageParam.class, "", true); + int ordercluster_id = getInt("ordercluster_id", 0); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer isprepaid = getInt("isprepaid"); + renderJson(Result.object(OrderclusterService.me.findChildren(pp, ordercluster_id, sn, truck_license, stm, etm, isprepaid, product_id, state))); + } + + /** + * 按主键查找单个对象 ordercluster 订单簇 - 集团客户订单 + */ + @Before(OrderclusterPKValidator.class) + public void get(){ + Ordercluster model = getModel(Ordercluster.class, "", true); // 忽略不在model中的字段 + renderJson(OrderclusterService.me.findByPk(model)); + } + + public void cancel(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + int ordercluster_id = getInt("id", -1); + + renderJson(Result.object(OrderclusterSyncService.me.cancel(ordercluster_id, tokenuser))); + } + + public void complete(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + int ordercluster_id = getInt("id", -1); + + renderJson(Result.object(OrderclusterSyncService.me.complete(ordercluster_id, tokenuser))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterEditValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterEditValidator.java new file mode 100644 index 0000000..7371446 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterEditValidator.java @@ -0,0 +1,50 @@ +package com.cowr.service.ssjygl.order.ordercluster; + +import com.cowr.common.utils.StrUtil; +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.cowr.model.Ordercluster; +import com.jfinal.core.Controller; +import com.jfinal.kit.StrKit; + +/** + * Generated by COWR Mon Jul 29 21:05:02 CST 2019 + * TableName: ordercluster + * Remarks: 订单簇 - 集团客户订单 + * PrimaryKey: id + */ +public class OrderclusterEditValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("id", "id", "id 必填"); + validateInteger("id", 1, 2147483647, "id", "id 范围 1~2147483647"); + + validateDate("cutoff_time", "yyyy-MM-dd HH:mm:ss", false, "cutoff_time", "cutoff_time 格式 yyyy-MM-dd HH:mm:ss"); // 默认时间时间字符串格式,生成后根据情况调整 + validateBigDecimal("avg_weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E10), "avg_weight", "avg_weight 范围 0~9.999999999999E10"); + validateBigDecimal("total_weight", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "total_weight", "total_weight 范围 0~9.9999999999E10"); + + // 选了物流公司,就必须填收获地址,运距 + if (StrKit.notBlank(c.get("trans_co_id"))) { // 可为空字段,当传入值时,才做验证 + validateInteger("trans_co_id", 1, 2147483647, "trans_co_id", "trans_co_id 范围 1~2147483647"); + + validateBigDecimal("trans_distance", new java.math.BigDecimal(0), new java.math.BigDecimal(9.999999999999E12), "trans_distance", "trans_distance 范围 0~9.999999999999E12"); + + validateString("customer_receiver_address", 0, 256, "customer_receiver_address", "customer_receiver_address 长度 0~256"); + validateString("customer_receiver_name", 1, 8, "customer_receiver_name", "customer_receiver_name 长度 1~8"); + validateRegex("customer_receiver_phone", StrUtil.regphone, "customer_receiver_phone", "customer_receiver_phone 必须为手机号格式"); + validateBigDecimal("customer_receiver_lgtd", new java.math.BigDecimal(74), new java.math.BigDecimal(135), "customer_receiver_lgtd", "customer_receiver_lgtd 范围 74~135"); + validateBigDecimal("customer_receiver_lttd", new java.math.BigDecimal(3.75), new java.math.BigDecimal(53.7), "customer_receiver_lttd", "customer_receiver_lttd 范围 3.75~53.7"); + } + + // 使用 model 更新时,model 不能只有主键有值 + // 这里用 getActionMethodName 写死,判断是 update 时,才做验证 + // 如果确实是需要将主键外的字段置为 null,可以在代码生成后删掉这段 + if ("edit".equals(getActionMethodName())) { + validateUpdateModel(Ordercluster.class, "", true); // 忽略不在model中的字段 + } + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java new file mode 100644 index 0000000..8ab7e3c --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordercluster/OrderclusterSyncService.java @@ -0,0 +1,278 @@ +package com.cowr.service.ssjygl.order.ordercluster; + +import com.cowr.common.enums.Enums; +import com.cowr.common.enums.OrderStateEnum; +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.supermarket.SupermarketService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.math.BigDecimal; +import java.sql.SQLException; +import java.util.Date; + +public class OrderclusterSyncService extends BaseSyncService { + public static OrderclusterSyncService me = new OrderclusterSyncService(); + private static Log log = Log.getLog(OrderclusterSyncService.class); + + public Result save(Ordercluster model, Sysuser sysuser) { + if (model.checkDuplicate("uuid")) { + return Result.failed(false, "新增失败, uuid 已存在"); + } + + // 设定了物流公司 + if (model.getTransCoId() != null) { + TransportCompany transCoObj = TransportCompany.dao.findById(model.getTransCoId()); + + if (transCoObj == null) { + return Result.failed("新增失败, 物流公司信息获取失败"); + } + + model.setTransCoName(transCoObj.getName()); + model.setTransCoAddress(transCoObj.getAddress()); + model.setTransCoBankName(transCoObj.getBankName()); + model.setTransCoBankAccount(transCoObj.getBankAccount()); + model.setTransCoPhone(transCoObj.getPhone()); + model.setTransCoTexpayerName(transCoObj.getTexpayerName()); + model.setTransCoTexpayerNum(transCoObj.getTexpayerNum()); + } + + Customer customerObj = Customer.dao.findById(model.getCustomerId()); + + if (customerObj == null) { + return Result.failed(false, "新增失败, 客户信息验证失败"); + } + + Product product = Product.dao.findById(model.getProductId()); + if (product == null) { + return Result.failedstr("没有找到商品信息【%s】", model.getProductId()); + } + + model.setProductName(product.getName()); + + // 客户信息 + model.setCustomerId(customerObj.getId()); + model.setCustomerAddress(customerObj.getAddress()); + model.setCustomerBankAccount(customerObj.getBankAccount()); + model.setCustomerBankName(customerObj.getBankName()); + model.setCustomerName(customerObj.getName()); + model.setCustomerPhone(customerObj.getPhone()); + model.setCustomerTexpayerName(customerObj.getTexpayerName()); + model.setCustomerTexpayerNum(customerObj.getTexpayerNum()); + + model.setUnitPrice(SupermarketService.me.getSupUnitPrice(model.getSupermarketId(), model.getProductId())); // 后端获取数据库中单价 + model.setCreateTime(new Date()); // 当前系统时间 + model.setCreateUserId(sysuser.getId()); // 当前用户id + model.setCreateUserName(sysuser.getName()); + model.setState(OrderStateEnum.INITIAL.getStateid()); // 新增固定为 1 + + if (model.getReqReceipt() == null) { + model.setReqReceipt(0); + } + + try { + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + try { + return model.save() + && SyncTaskService.me.save(new SyncTask().addSaveData(model)) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + + return false; + } + } + }); + + return ret ? Result.success(model) : Result.failed("保存失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed("保存失败"); + } + } + + public Result update(Ordercluster model, Sysuser sysuser) { + Ordercluster oldobj = model.findByPk(); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + if (oldobj.getState() >= OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed(false, "订单已完成,不能修改"); + } + + if (model.getCutoffTime() != null) { + oldobj.setCutoffTime(model.getCutoffTime()); + } + if (model.getAvgWeight() != null) { + oldobj.setAvgWeight(model.getAvgWeight()); + } + + if(model.getTotalWeight() != null ){ + String sql = "select t.ordercluster_id, sum(t.weight) weight from order_sale t \n" + + " where t.state = ? \n" + + " and t.ordercluster_id = ? \n" + + " group by t.ordercluster_id \n" + + " union \n" + + " select t.ordercluster_id, sum(t.weight) weight from order_temp t \n" + + " where t.state = ? \n" + + " and t.ordercluster_id = ? \n" + + " group by t.ordercluster_id "; + + Record record = Db.findFirst(sql, OrderStateEnum.RECEIVED.getStateid(), model.getId(), OrderStateEnum.RECEIVED.getStateid(), model.getId()); + + if(record != null){ + if(model.getTotalWeight().compareTo(record.getBigDecimal("weight")) < 0){ + return Result.failedstr("总量不能低于已运输量(%.2f)", record.getBigDecimal("weight")); + }else{ + oldobj.setTotalWeight(model.getTotalWeight()); + } + }else{ + oldobj.setTotalWeight(model.getTotalWeight()); + } + } + + oldobj.setCutoffTime(model.getCutoffTime()); + oldobj.setAvgWeight(model.getAvgWeight()); + + if(model.getTransDistance() != null){ + oldobj.setTransDistance(model.getTransDistance()); + } + + if(model.getReqReceipt() != null) { + oldobj.setReqReceipt(model.getReqReceipt()); + } + + if(model.getCustomerTexpayerName() != null){ + oldobj.setCustomerTexpayerName(model.getCustomerTexpayerName()); + } + + if(model.getCustomerTexpayerNum() != null){ + oldobj.setCustomerTexpayerNum(model.getCustomerTexpayerNum()); + } + + // 设定了物流公司,并且和以前的不一样 + if (model.getTransCoId() != null && !model.getTransCoId().equals(oldobj.getTransCoId())) { + TransportCompany transCoObj = TransportCompany.dao.findById(model.getTransCoId()); + + if (transCoObj == null) { + return Result.failed("新增失败, 物流公司信息获取失败"); + } + + oldobj.setTransCoId(transCoObj.getId()); + oldobj.setTransCoName(transCoObj.getName()); + oldobj.setTransCoAddress(transCoObj.getAddress()); + oldobj.setTransCoBankName(transCoObj.getBankName()); + oldobj.setTransCoBankAccount(transCoObj.getBankAccount()); + oldobj.setTransCoPhone(transCoObj.getPhone()); + oldobj.setTransCoTexpayerName(transCoObj.getTexpayerName()); + oldobj.setTransCoTexpayerNum(transCoObj.getTexpayerNum()); + } + + try { + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + try { + return oldobj.update() + && SyncTaskService.me.save(new SyncTask().addUpdateData(model)) + && ModifyLogService.me.save(model, null, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + + return false; + } + } + }); + + return ret ? Result.success(model) : Result.failed("修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed("修改失败"); + } + } + + public Result cancel(int ordercluster_id, Sysuser sysuser) { + Ordercluster oldobj = Ordercluster.dao.findById(ordercluster_id); + + if (oldobj == null) { + return Result.failed("按主键未找到对应记录"); + } + + if (oldobj.getState() != OrderStateEnum.INITIAL.getStateid()) { + return Result.failed("只能取消未执行的集团订单"); + } + + oldobj.setState(OrderStateEnum.INVALID.getStateid()); // 将订单状态置为 9 + // TODO: 如果后面加了派车车辆,要将关联派车取消 + + try { + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + try { + return oldobj.update() + && SyncTaskService.me.save(new SyncTask().addUpdateData(oldobj)) + && ModifyLogService.me.save(oldobj, null, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + + return false; + } + } + }); + + return ret ? Result.success(oldobj) : Result.failed("修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed("修改失败"); + } + } + + public Result complete(int ordercluster_id, Sysuser sysuser) { + Ordercluster oldobj = Ordercluster.dao.findById(ordercluster_id); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + if (oldobj.getState() == OrderStateEnum.RECEIVED.getStateid()) { + return Result.failed("已经完结的,不能再修改"); + } + + oldobj.setState(OrderStateEnum.RECEIVED.getStateid()); // 将订单状态置为 5 + oldobj.setCompleteTime(new Date()); + // TODO: 如果后面加了派车车辆,要将关联派车取消 + + try { + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + try { + return oldobj.update() + && SyncTaskService.me.save(new SyncTask().addUpdateData(oldobj)) + && ModifyLogService.me.save(oldobj, null, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + + return false; + } + } + }); + + return ret ? Result.success(oldobj) : Result.failed("修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed("修改失败"); + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/orderpurchase/OrderPurchaseController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/orderpurchase/OrderPurchaseController.java new file mode 100644 index 0000000..dacd565 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/orderpurchase/OrderPurchaseController.java @@ -0,0 +1,35 @@ +package com.cowr.service.ssjygl.order.orderpurchase; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.order.orderpurchase.OrderPurchasePKValidator; +import com.cowr.ssjygl.order.orderpurchase.OrderPurchaseService; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +public class OrderPurchaseController extends BaseController { + private static Log log = Log.getLog(OrderPurchaseController.class); + + @Before(OrderPurchasePKValidator.class) + public void get() { + renderJson(Result.object(OrderPurchaseService.me.get(get("sn")))); + } + + /** + * 分页查找 order_purchase 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + + renderJson(Result.object(OrderPurchaseService.me.find(pp, sn, truck_license, supermarket_id, sandfarm_id, stm, etm, product_id, state))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordersale/OrderSaleController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordersale/OrderSaleController.java new file mode 100644 index 0000000..e0055c4 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordersale/OrderSaleController.java @@ -0,0 +1,34 @@ +package com.cowr.service.ssjygl.order.ordersale; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.order.ordersale.OrderSalePKValidator; +import com.cowr.ssjygl.order.ordersale.OrderSaleService; +import com.jfinal.aop.Before; + +public class OrderSaleController extends BaseController { + @Before(OrderSalePKValidator.class) + public void get(){ + renderJson(Result.object(OrderSaleService.me.get(get("sn")))); + } + + /** + * 分页查找 order_sale 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String customer_name = get("customer_name"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer trans_co_id = getInt("trans_co_id"); + Integer isprepaid = getInt("isprepaid"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(OrderSaleService.me.find(pp, sn, truck_license, supermarket_id, trans_co_id, customer_id, customer_name, stm, etm, isprepaid, product_id, state))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java new file mode 100644 index 0000000..33f0b60 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertemp/OrderTempController.java @@ -0,0 +1,33 @@ +package com.cowr.service.ssjygl.order.ordertemp; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.order.ordertemp.OrderTempPKValidator; +import com.cowr.ssjygl.order.ordertemp.OrderTempService; +import com.jfinal.aop.Before; + +public class OrderTempController extends BaseController { + @Before(OrderTempPKValidator.class) + public void get() { + renderJson(Result.object(OrderTempService.me.get(get("sn")))); + } + + /** + * 分页查找 order_sale 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String customer_name = get("customer_name"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer isprepaid = getInt("isprepaid"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(OrderTempService.me.find(pp, sn, truck_license, supermarket_id, customer_id, customer_name, stm, etm, isprepaid, product_id, state))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertransfer/OrderTransferController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertransfer/OrderTransferController.java new file mode 100644 index 0000000..396e4f4 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertransfer/OrderTransferController.java @@ -0,0 +1,35 @@ +package com.cowr.service.ssjygl.order.ordertransfer; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.order.ordertransfer.OrderTransferPKValidator; +import com.cowr.ssjygl.order.ordertransfer.OrderTransferService; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +public class OrderTransferController extends BaseController { + private static Log log = Log.getLog(OrderTransferController.class); + + @Before(OrderTransferPKValidator.class) + public void get(){ + renderJson(Result.object(OrderTransferService.me.get(get("sn")))); + } + + /** + * 分页查找 order_transfer 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + + renderJson(Result.object(OrderTransferService.me.find(pp, sn, truck_license, supermarket_id, sandfarm_id, stm, etm, product_id, state))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertrash/OrderTrashController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertrash/OrderTrashController.java new file mode 100644 index 0000000..1714ce8 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/order/ordertrash/OrderTrashController.java @@ -0,0 +1,34 @@ +package com.cowr.service.ssjygl.order.ordertrash; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.order.ordertrash.OrderTrashPKValidator; +import com.cowr.ssjygl.order.ordertrash.OrderTrashService; +import com.jfinal.aop.Before; +import com.jfinal.log.Log; + +public class OrderTrashController extends BaseController { + private static Log log = Log.getLog(OrderTrashController.class); + + @Before(OrderTrashPKValidator.class) + public void get(){ + renderJson(Result.object(OrderTrashService.me.get(get("sn")))); + } + + /** + * 分页查找 order_trash 订单 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String stm = get("stm"); + String etm = get("etm"); + String truck_license = getUpperCaseVal("truck_license"); + String sn = get("sn"); + Integer state = getInt("state"); + Integer product_id = getInt("product_id"); + Integer supermarket_id = getInt("supermarket_id"); + + renderJson(Result.object(OrderTrashService.me.find(pp, sn, truck_license, supermarket_id, stm, etm, product_id, state))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java new file mode 100644 index 0000000..924a35a --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaycustomer/PrepayCustomerSyncService.java @@ -0,0 +1,4 @@ +package com.cowr.service.ssjygl.prepay.prepaycustomer; + +public class PrepayCustomerSyncService { +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailController.java new file mode 100644 index 0000000..91cb56b --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailController.java @@ -0,0 +1,165 @@ +package com.cowr.service.ssjygl.prepay.prepaydetail; + +import com.cowr.common.validator.CustomerIdValidator; +import com.cowr.common.validator.StartAndEndTimeValidator; +import com.cowr.common.view.ExcelRender; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.PrepayDetail; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.prepay.prepaydetail.PrepayDetailPKValidator; +import com.cowr.ssjygl.prepay.prepaydetail.PrepayDetailService; +import com.cowr.ssjygl.prepay.prepaydetail.PrepayDetailValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; +import org.apache.poi.ss.usermodel.Workbook; + +/** + * Generated by COWR Mon Feb 10 12:11:02 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class PrepayDetailController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(PrepayDetailPKValidator.class) + public void checkExistsByPk(){ + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailService.me.checkExistsByPk(model)); + } + + /** + * 新增 prepay_detail 预付费客户付费详情 + */ + @Before(PrepayDetailValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 prepay_detail 预付费客户付费详情 + */ + @Before(PrepayDetailPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 prepay_detail 预付费客户付费详情 + */ + @Before(PrepayDetailPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 prepay_detail 预付费客户付费详情 + */ + @Before(PrepayDetailValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 prepay_detail 预付费客户付费详情 + */ + public void find(){ + String name = get("name"); + String stm = get("stm"); + String etm = get("etm"); + Integer state = getInt("state"); + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(PrepayDetailService.me.find(pp, name, stm, etm, state))); + } + + /** + * 按主键查找单个对象 prepay_detail 预付费客户付费详情 + */ + @Before(PrepayDetailPKValidator.class) + public void findByPk(){ + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 prepay_detail 预付费客户付费详情 + */ + @Before(PrepayDetailPKValidator.class) + public void get(){ + PrepayDetail model = getModel(PrepayDetail.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayDetailService.me.findByPk(model)); + } + + /** + * 返回所有 prepay_detail 预付费客户付费详情 + */ + @Before({StartAndEndTimeValidator.class, CustomerIdValidator.class}) + public void list(){ + int export = getInt("export", 0); // 是否导出为exce 0 不导出,1 导出 + int customer_id = getInt("customer_id", 0); + String stm = get("stm"); + String etm = get("etm"); + + if (export == 0) { + renderJson(Result.object(PrepayDetailService.me.list(customer_id, stm, etm))); + } else { + Workbook wb = PrepayDetailService.me.listExport(customer_id, stm, etm); + render(new ExcelRender("客户流水_" + System.currentTimeMillis() + ".xlsx", wb)); + } + } + + @Before(PrepayDetailVerifyValidator.class) + public void verify(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String id = get("id"); + int state = getInt("state", 0); + String memo = get("memo"); + + renderJson(PrepayDetailSyncService.me.verify(id, state, memo, tokenuser)); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java new file mode 100644 index 0000000..1224adb --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailSyncService.java @@ -0,0 +1,208 @@ +package com.cowr.service.ssjygl.prepay.prepaydetail; + +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import java.sql.SQLException; +import java.util.Date; + +public class PrepayDetailSyncService extends BaseSyncService { + public static PrepayDetailSyncService me = new PrepayDetailSyncService(); + private static Log log = Log.getLog(PrepayDetailSyncService.class); + + public Result save(PrepayDetail model, Sysuser user) { + try { + Integer customer_id = model.getCustomerId(); + Customer customer = Customer.dao.findById(customer_id); + + if (customer == null) { + return Result.failed("按客户 id 未找到对应客户信息"); + } + + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if (supermarket == null) { + return Result.failed("按超市 id 未找到对应超市信息"); + } + + model.setId(StrKit.getRandomUUID()); + model.setState(1); + model.setType(1); + + SyncTask synctask = new SyncTask(); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + boolean ret = model.save(); + + if (!ret) { + return false; + } + + PrepayDetailStateHistory his = new PrepayDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setPrepayDetailId(model.getId()); + his.setChangeUserId(user.getId()); + his.setChangeUserName(user.getName()); + his.setState(model.getState()); + his.setChangeTime(new Date()); + + ret = his.save(); + + if (!ret) { + return false; + } + + synctask.addSaveData(model); + synctask.addSaveData(his); + + return SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), user); + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, e.getMessage()); + } + } + + /** + * 审核预付费记录 + * + * @param id + * @param state + * @param memo + * @param user + * @return + */ + public Result verify(String id, int state, String memo, Sysuser user) { + if (!SysuserService.me.isPresident(user.getRole())) { // 总经理审核预付费 + return Result.permissionDenied(); + } + + if (state != 2 && state != 9) { + return Result.failed("state 值错误"); + } + + PrepayDetail model = PrepayDetail.dao.findById(id); + + if (model == null) { + return Result.failed("没有找到预付费记录"); + } + + if (model.getState() == state) { + return Result.failed("预付费状态未变化"); + } + + Customer customer = Customer.dao.findById(model.getCustomerId()); + + if (customer == null) { + return Result.failed("未找到有效的客户信息"); + } + + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if (supermarket == null) { + return Result.failed("按超市 id 未找到对应超市信息"); + } + + try { + PrepayDetail oldmodel = model.clone(); + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + boolean ret = false; + Date now = new Date(); + SyncTask synctask = new SyncTask(); + + model.setState(state); + model.setVerifyTime(now); + + ret = model.update(); + + if (!ret) { + return false; + } + + synctask.addUpdateData(model); + + // 只有在 state == 2 表示审核通过时,更新余额 + if (state == 2) { + customer.setType(1); // 标记为预付费用户 + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), supermarket.getId()); + if (prepayCustomer == null) { + prepayCustomer = new PrepayCustomer(); + prepayCustomer.setCustomerId(customer.getId()); + prepayCustomer.setSupermarketId(supermarket.getId()); + prepayCustomer.setSurplus(model.getAmount()); // 更新余额 + prepayCustomer.setRechargeTime(now); // 更新最后一次充值时间 + prepayCustomer.setFirstRechargeTime(now); + + ret = prepayCustomer.save(); + + synctask.addSaveData(prepayCustomer); + } else { + prepayCustomer.setSurplus(prepayCustomer.getSurplus().add(model.getAmount())); // 更新余额 + prepayCustomer.setRechargeTime(now); // 更新最后一次充值时间 + + ret = prepayCustomer.update(); + + synctask.addUpdateData(prepayCustomer); + + } + + if (!ret) { + return false; + } + + ret = customer.update(); + + synctask.addUpdateData(customer); + } + + if (!ret) { + return false; + } + + PrepayDetailStateHistory his = new PrepayDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setPrepayDetailId(model.getId()); + his.setChangeUserId(user.getId()); + his.setChangeUserName(user.getName()); + his.setState(model.getState()); + his.setChangeTime(now); + his.setMemo(memo); + + ret = his.save(); + + if (!ret) { + return false; + } + + synctask.addSaveData(his); + + return SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, oldmodel, Enums.DataOpType.UPDATE.getId(), user); + } + }); + + return ret ? Result.success(true) : Result.failed(false, "更新失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, e.getMessage()); + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java new file mode 100644 index 0000000..3928bb1 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaydetail/PrepayDetailVerifyValidator.java @@ -0,0 +1,32 @@ +package com.cowr.service.ssjygl.prepay.prepaydetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class PrepayDetailVerifyValidator extends CrudParamValidator { + private static List chkstate = new ArrayList(){{ + add(2); + add(9); + }}; + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + validateInIntegerArray("state", chkstate, "state", "state 可选值 2、9"); + validateString("memo", 0, 255, "memo", "memo 长度 0~255"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaytruck/PrepayTruckController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaytruck/PrepayTruckController.java new file mode 100644 index 0000000..1239603 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/prepaytruck/PrepayTruckController.java @@ -0,0 +1,75 @@ +package com.cowr.service.ssjygl.prepay.prepaytruck; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.PrepayTruck; +import com.cowr.ssjygl.prepay.prepaytruck.DayValidator; +import com.cowr.ssjygl.prepay.prepaytruck.PrepayTruckPKValidator; +import com.cowr.ssjygl.prepay.prepaytruck.PrepayTruckService; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Sun Feb 23 21:22:12 CST 2020 + * TableName: prepay_truck + * Remarks: 每日超市指定预付费车辆 + * PrimaryKey: id + */ +public class PrepayTruckController extends BaseController { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(PrepayTruckPKValidator.class) + public void checkExistsByPk() { + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckService.me.checkExistsByPk(model)); + } + + /** + * 分页查找 prepay_truck 每日超市指定预付费车辆 + */ + @Before(DayValidator.class) + public void find() { + Integer customer_id = getInt("customer_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer trans_co_id = getInt("trans_co_id"); + String truck_license = getUpperCaseVal("truck_license"); + String valid_date = get("valid_date"); + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(PrepayTruckService.me.find(pp, customer_id, supermarket_id, trans_co_id, truck_license, valid_date))); + } + + /** + * 按主键查找单个对象 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckPKValidator.class) + public void findByPk() { + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 prepay_truck 每日超市指定预付费车辆 + */ + @Before(PrepayTruckPKValidator.class) + public void get() { + PrepayTruck model = getModel(PrepayTruck.class, "", true); // 忽略不在model中的字段 + renderJson(PrepayTruckService.me.findByPk(model)); + } + + /** + * 返回所有 prepay_truck 每日超市指定预付费车辆 + */ + public void list() { + Integer customer_id = getInt("customer_id"); + Integer supermarket_id = getInt("supermarket_id"); + Integer trans_co_id = getInt("trans_co_id"); + String truck_license = getUpperCaseVal("truck_license"); + String valid_date = get("valid_date"); + renderJson(Result.object(PrepayTruckService.me.list(customer_id, supermarket_id, trans_co_id, truck_license, valid_date))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java new file mode 100644 index 0000000..ce35605 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailConfirmValidator.java @@ -0,0 +1,32 @@ +package com.cowr.service.ssjygl.prepay.refunddetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class RefundDetailConfirmValidator extends CrudParamValidator { + private static List chkstate = new ArrayList(){{ + add(2); + add(9); + }}; + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + validateBigDecimal("amount", new java.math.BigDecimal(0), new java.math.BigDecimal(9.9999999999E10), "amount", "amount 范围 0~9.9999999999E10"); + validateString("serialnum", 1, 128, "serialnum", "serialnum 长度 0~128"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailController.java new file mode 100644 index 0000000..cd435ec --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailController.java @@ -0,0 +1,166 @@ +package com.cowr.service.ssjygl.prepay.refunddetail; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.RefundDetail; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.prepay.refunddetail.*; +import com.jfinal.aop.Before; + +import java.math.BigDecimal; + +/** + * Generated by COWR Mon Feb 10 12:11:02 CST 2020 + * TableName: refund_detail + * Remarks: 预付费客户退费详情 + * PrimaryKey: id + */ +public class RefundDetailController extends BaseController { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(RefundDetailPKValidator.class) + public void checkExistsByPk(){ + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailService.me.checkExistsByPk(model)); + } + + /** + * 新增 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 refund_detail 预付费客户退费详情 + */ + public void find(){ + String name = get("name"); + String stm = get("stm"); + String etm = get("etm"); + Integer state = getInt("state"); + PageParam pp = getBean(PageParam.class, "", true); + renderJson(Result.object(RefundDetailService.me.find(pp, name, stm, etm, state))); + } + + /** + * 按主键查找单个对象 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailPKValidator.class) + public void findByPk(){ + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 refund_detail 预付费客户退费详情 + */ + @Before(RefundDetailPKValidator.class) + public void get(){ + RefundDetail model = getModel(RefundDetail.class, "", true); // 忽略不在model中的字段 + renderJson(RefundDetailService.me.findByPk(model)); + } + + /** + * 返回所有 refund_detail 预付费客户退费详情 + */ + public void list(){ + renderJson(Result.object(RefundDetailService.me.list())); + } + + + @Before(RefundDetailVerifyValidator.class) + public void verify(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String id = get("id"); + int state = getInt("state", 0); + String memo = get("memo"); + + renderJson(RefundDetailSyncService.me.verify(id, state, memo, tokenuser)); + } + @Before(RefundDetailConfirmValidator.class) + public void confirm(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + String id = get("id"); + BigDecimal amount = new BigDecimal(getParaToDouble("amount", 0d)); + String serialnum = get("serialnum", ""); + + renderJson(RefundDetailSyncService.me.confirm(id, amount, serialnum, tokenuser)); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java new file mode 100644 index 0000000..47995d6 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailSyncService.java @@ -0,0 +1,310 @@ +package com.cowr.service.ssjygl.prepay.refunddetail; + +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.cowr.ssjygl.prepay.prepaycustomer.PrepayCustomerService; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; + +import java.math.BigDecimal; +import java.sql.SQLException; +import java.util.Date; + +public class RefundDetailSyncService extends BaseSyncService { + public static RefundDetailSyncService me = new RefundDetailSyncService(); + private static Log log = Log.getLog(RefundDetailSyncService.class); + + public Result save(RefundDetail model, Sysuser user) { + try { + Integer customer_id = model.getCustomerId(); + Customer customer = Customer.dao.findById(customer_id); + + if (customer == null) { + return Result.failed("按客户 id 未找到对应客户信息"); + } + + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if (supermarket == null) { + return Result.failed("按超市 id 未找到对应超市信息"); + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), supermarket.getId()); + + if (prepayCustomer == null) { + return Result.failed("未找到客户预付费信息"); + } + + if (model.getAmount().compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failed("退费金额不能大于账户余额"); + } + + RefundDetail oldrd = RefundDetail.dao.findFirst("select * from refund_detail \n" + + " where customer_id = ? \n" + + " and state < 3 \n" + // 如果有状态为 1、2 就不能再申请了 + " order by id desc limit 0,1", customer_id); + + if (oldrd != null) { + return Result.failed(oldrd, "已存在未处理完成的退费申请"); + } + + model.setId(StrKit.getRandomUUID()); + model.setState(1); + + SyncTask synctask = new SyncTask(); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + boolean ret = model.save(); + + if (!ret) { + return false; + } + + RefundDetailStateHistory his = new RefundDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setRefundDetailId(model.getId()); + his.setChangeUserId(user.getId()); + his.setChangeUserName(user.getName()); + his.setState(model.getState()); + his.setChangeTime(new Date()); + + ret = his.save(); + + if (!ret) { + return false; + } + + synctask.addSaveData(model); + synctask.addSaveData(his); + + return SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), user); + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, e.getMessage()); + } + } + + /** + * 审核退费记录 + * 审核通过后,才由财务退款,财务退款后,才更新客户余额 + * + * @param id + * @param state + * @param memo + * @param user + * @return + */ + public Result verify(String id, int state, String memo, Sysuser user) { + if (!SysuserService.me.isPresident(user.getRole())) { // 总经理审核退费 + return Result.permissionDenied(); + } + + if (state != 2 && state != 9) { + return Result.failed("state 值错误"); + } + + RefundDetail model = RefundDetail.dao.findById(id); + + if (model == null) { + return Result.failed("没有找到预付费记录"); + } + + if (model.getState() == state) { + return Result.failed("预付费状态未变化"); + } + + Customer customer = Customer.dao.findById(model.getCustomerId()); + + if (customer == null) { + return Result.failed("未找到有效的客户信息"); + } + + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if (supermarket == null) { + return Result.failed("按超市 id 未找到对应超市信息"); + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), supermarket.getId()); + + if (prepayCustomer == null) { + return Result.failed("未找到客户预付费信息"); + } + + if (prepayCustomer.getSurplus() == null || model.getAmount().compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failed("退费金额不能大于账户余额"); + } + + try { + RefundDetail oldmodel = model.clone(); + SyncTask synctask = new SyncTask(); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + boolean ret = false; + Date now = new Date(); + + model.setState(state); + model.setVerifyTime(now); + + ret = model.update(); + + if (!ret) { + return false; + } + + synctask.addUpdateData(model); + + RefundDetailStateHistory his = new RefundDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setRefundDetailId(model.getId()); + his.setChangeUserId(user.getId()); + his.setChangeUserName(user.getName()); + his.setState(model.getState()); + his.setChangeTime(now); + his.setMemo(memo); + + ret = his.save(); + + if (!ret) { + return false; + } + + synctask.addSaveData(his); + + return SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, oldmodel, Enums.DataOpType.UPDATE.getId(), user); + } + }); + + return ret ? Result.success(true) : Result.failed(false, "更新失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, e.getMessage()); + } + } + + + /** + * 确认执行退费 + * + * @return Result + */ + public Result confirm(String id, BigDecimal amount, String serialnum, Sysuser user) { + try { + if (!SysuserService.me.isTreasurer(user.getRole())) { // 财务执行退费 + return Result.permissionDenied(); + } + + // 注意这里有 !,找到后才做 update 操作 + RefundDetail model = RefundDetail.dao.findById(id); + + if (model == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + if (model.getState() != 2) { + return Result.failed(false, "未审核通过,不能执行退费操作"); + } + + Customer customer = Customer.dao.findById(model.getCustomerId()); + + if (customer == null) { + return Result.failed("未找到有效的客户信息"); + } + + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if (supermarket == null) { + return Result.failed("按超市 id 未找到对应超市信息"); + } + + PrepayCustomer prepayCustomer = PrepayCustomerService.me.getPrepayCustomer(customer.getId(), supermarket.getId()); + + if (prepayCustomer == null) { + return Result.failed("未找到客户预付费信息"); + } + + if (prepayCustomer.getSurplus() == null || amount.compareTo(prepayCustomer.getSurplus()) > 0) { + return Result.failed("退费金额不能大于账户余额"); + } + + model.setAmount(amount); + model.setSerialnum(serialnum); + model.setState(3); + + SyncTask synctask = new SyncTask(); + + RefundDetail oldmodel = model.clone(); + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.update(); + + if (ret) { + // 只有在 state == 3 时,更新余额 + if (model.getState() == 3) { + prepayCustomer.setSurplus(prepayCustomer.getSurplus().subtract(amount)); // 实际退费以财务确认退费金额为准 + + ret = prepayCustomer.update(); + + synctask.addUpdateData(prepayCustomer); + } + } + + if (!ret) { + return false; + } + + synctask.addUpdateData(model); + + RefundDetailStateHistory his = new RefundDetailStateHistory(); + his.setId(StrKit.getRandomUUID()); + his.setRefundDetailId(model.getId()); + his.setChangeUserId(user.getId()); + his.setChangeUserName(user.getName()); + his.setState(model.getState()); + his.setChangeTime(new Date()); + his.setMemo("财务执行退费"); + + ret = his.save(); + + if (!ret) { + return false; + } + + synctask.addSaveData(his); + + return SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, oldmodel, Enums.DataOpType.UPDATE.getId(), user); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "更新失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "更新失败"); + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java new file mode 100644 index 0000000..f6f3f72 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/prepay/refunddetail/RefundDetailVerifyValidator.java @@ -0,0 +1,32 @@ +package com.cowr.service.ssjygl.prepay.refunddetail; + + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +import java.util.ArrayList; +import java.util.List; + +/** + * Generated by COWR Mon Feb 10 12:11:03 CST 2020 + * TableName: prepay_detail + * Remarks: 预付费客户付费详情 + * PrimaryKey: id + */ +public class RefundDetailVerifyValidator extends CrudParamValidator { + private static List chkstate = new ArrayList(){{ + add(2); + add(9); + }}; + @Override + protected void validate(Controller c) { + validateString("id", 32, 32, "id", "id 长度 32,必填"); + validateInIntegerArray("state", chkstate, "state", "state 可选值 2、9"); + validateString("memo", 0, 255, "memo", "memo 长度 0~255"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductController.java new file mode 100644 index 0000000..c238b69 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductController.java @@ -0,0 +1,132 @@ +package com.cowr.service.ssjygl.product; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Product; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.product.ProductPKValidator; +import com.cowr.ssjygl.product.ProductService; +import com.cowr.ssjygl.product.ProductValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: product + * Remarks: 商品信息 + * PrimaryKey: id + */ +public class ProductController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(ProductPKValidator.class) + public void checkExistsByPk(){ + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductService.me.checkExistsByPk(model)); + } + + /** + * 新增 product 商品信息 + */ + @Before(ProductValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 product 商品信息 + */ + @Before(ProductPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 product 商品信息 + */ + @Before(ProductPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 product 商品信息 + */ + @Before(ProductValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 product 商品信息 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(ProductService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 product 商品信息 + */ + @Before(ProductPKValidator.class) + public void findByPk(){ + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 product 商品信息 + */ + @Before(ProductPKValidator.class) + public void get(){ + Product model = getModel(Product.class, "", true); // 忽略不在model中的字段 + renderJson(ProductService.me.findByPk(model)); + } + + /** + * 返回所有 product 商品信息 + */ + public void list(){ + renderJson(Result.object(ProductService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductSyncService.java new file mode 100644 index 0000000..c59ab95 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/product/ProductSyncService.java @@ -0,0 +1,14 @@ +package com.cowr.service.ssjygl.product; + + +import com.cowr.service.ssjygl.base.BaseSyncService; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: product + * Remarks: 商品信息 + * PrimaryKey: id + */ +public class ProductSyncService extends BaseSyncService { + public static final ProductSyncService me = new ProductSyncService(); +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseController.java new file mode 100644 index 0000000..5676c34 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseController.java @@ -0,0 +1,132 @@ +package com.cowr.service.ssjygl.purchase; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Purchase; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.purchase.PurchasePKValidator; +import com.cowr.ssjygl.purchase.PurchaseService; +import com.cowr.ssjygl.purchase.PurchaseValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: purchase + * Remarks: 采购点(采砂场) + * PrimaryKey: id + */ +public class PurchaseController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(PurchasePKValidator.class) + public void checkExistsByPk(){ + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseService.me.checkExistsByPk(model)); + } + + /** + * 新增 purchase 采购点(采砂场) + */ + @Before(PurchaseValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 purchase 采购点(采砂场) + */ + @Before(PurchasePKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 purchase 采购点(采砂场) + */ + @Before(PurchasePKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 purchase 采购点(采砂场) + */ + @Before(PurchaseValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 purchase 采购点(采砂场) + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(PurchaseService.me.find(pp, name,del))); + } + + /** + * 按主键查找单个对象 purchase 采购点(采砂场) + */ + @Before(PurchasePKValidator.class) + public void findByPk(){ + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 purchase 采购点(采砂场) + */ + @Before(PurchasePKValidator.class) + public void get(){ + Purchase model = getModel(Purchase.class, "", true); // 忽略不在model中的字段 + renderJson(PurchaseService.me.findByPk(model)); + } + + /** + * 返回所有 purchase 采购点(采砂场) + */ + public void list(){ + renderJson(Result.object(PurchaseService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseSyncService.java new file mode 100644 index 0000000..b031883 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/purchase/PurchaseSyncService.java @@ -0,0 +1,14 @@ +package com.cowr.service.ssjygl.purchase; + + +import com.cowr.service.ssjygl.base.BaseSyncService; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: purchase + * Remarks: 采购点(采砂场) + * PrimaryKey: id + */ +public class PurchaseSyncService extends BaseSyncService { + public static final PurchaseSyncService me = new PurchaseSyncService(); +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmController.java new file mode 100644 index 0000000..1460552 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmController.java @@ -0,0 +1,132 @@ +package com.cowr.service.ssjygl.sandfarm; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Sandfarm; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.sandfarm.SandfarmPKValidator; +import com.cowr.ssjygl.sandfarm.SandfarmService; +import com.cowr.ssjygl.sandfarm.SandfarmValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: sandfarm + * Remarks: 生产点(采砂场) + * PrimaryKey: id + */ +public class SandfarmController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SandfarmPKValidator.class) + public void checkExistsByPk(){ + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmService.me.checkExistsByPk(model)); + } + + /** + * 新增 sandfarm 生产点(采砂场) + */ + @Before(SandfarmValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmSyncService.me.save(model, tokenuser,"name")); + } + + /** + * 删除 sandfarm 生产点(采砂场) + */ + @Before(SandfarmPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 sandfarm 生产点(采砂场) + */ + @Before(SandfarmPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 sandfarm 生产点(采砂场) + */ + @Before(SandfarmValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 sandfarm 生产点(采砂场) + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(SandfarmService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 sandfarm 生产点(采砂场) + */ + @Before(SandfarmPKValidator.class) + public void findByPk(){ + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 sandfarm 生产点(采砂场) + */ + @Before(SandfarmPKValidator.class) + public void get(){ + Sandfarm model = getModel(Sandfarm.class, "", true); // 忽略不在model中的字段 + renderJson(SandfarmService.me.findByPk(model)); + } + + /** + * 返回所有 sandfarm 生产点(采砂场) + */ + public void list(){ + renderJson(Result.object(SandfarmService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmSyncService.java new file mode 100644 index 0000000..1aec23b --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/sandfarm/SandfarmSyncService.java @@ -0,0 +1,17 @@ +package com.cowr.service.ssjygl.sandfarm; + + +import com.cowr.service.ssjygl.base.BaseSyncService; + +/** + * 带 Sync 处理需要同步的数据 + * 不带 Sync 的为原来通用的 service + * + * Generated by COWR Sat Apr 04 17:23:04 CST 2020 + * TableName: sandfarm + * Remarks: 生产点(采砂场) + * PrimaryKey: id + */ +public class SandfarmSyncService extends BaseSyncService { + public static final SandfarmSyncService me = new SandfarmSyncService(); +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupAddProductValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupAddProductValidator.java new file mode 100644 index 0000000..4f18cb6 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupAddProductValidator.java @@ -0,0 +1,18 @@ +package com.cowr.service.ssjygl.supermarket; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class SupAddProductValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateRequired("product_id", "product_id", "product_id 必填"); + validateBigDecimal("unit_price", new java.math.BigDecimal(1), new java.math.BigDecimal(9.9999999999E10), "unit_price", "unit_price 范围 1~9.9999999999E10"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupRemoveProductValidator.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupRemoveProductValidator.java new file mode 100644 index 0000000..b705b37 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupRemoveProductValidator.java @@ -0,0 +1,17 @@ +package com.cowr.service.ssjygl.supermarket; + +import com.cowr.common.validator.CrudParamValidator; +import com.cowr.common.view.Result; +import com.jfinal.core.Controller; + +public class SupRemoveProductValidator extends CrudParamValidator { + @Override + protected void validate(Controller c) { + validateRequired("supermarket_id", "supermarket_id", "supermarket_id 必填"); + validateRequired("product_id", "product_id", "product_id 必填"); + } + + protected void handleError(Controller c) { + c.renderJson(Result.failed(getErrmsg())); + } +} \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketController.java new file mode 100644 index 0000000..221ea02 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketController.java @@ -0,0 +1,95 @@ +package com.cowr.service.ssjygl.supermarket; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Supermarket; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.supermarket.SupermarketPKValidator; +import com.cowr.ssjygl.supermarket.SupermarketService; +import com.cowr.ssjygl.supermarket.SupermarketValidator; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: supermarket + * Remarks: 销售点(超市) + * PrimaryKey: id + */ +public class SupermarketController extends BaseController { + + /** + * 修改 supermarket 销售点(超市) + */ + @Before(SupermarketValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Supermarket model = getModel(Supermarket.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSyncService.me.update(model, tokenuser)); + + SupermarketSyncService.me.initSupCache(); // 更新缓存 + } + + /** + * 分页查找 supermarket 销售点(超市) + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(SupermarketService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 supermarket 销售点(超市) + */ + @Before(SupermarketPKValidator.class) + public void get(){ + renderJson(SupermarketService.me.get(getInt("id"))); + } + + /** + * 返回所有 supermarket 销售点(超市) + */ + public void list(){ + renderJson(Result.object(SupermarketService.me.list())); + } + + @Before(SupAddProductValidator.class) + public void addProduct(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + int supermarket_id = getInt("supermarket_id"); + int product_id = getInt("product_id"); + double unit_price = getParaToDouble("unit_price"); + + renderJson(SupermarketSyncService.me.addProduct(supermarket_id, product_id, unit_price, tokenuser)); + } + + @Before(SupRemoveProductValidator.class) + public void removeProduct(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + int supermarket_id = getInt("supermarket_id"); + int product_id = getInt("product_id"); + + renderJson(SupermarketSyncService.me.removeProduct(supermarket_id, product_id, tokenuser)); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java new file mode 100644 index 0000000..56b31d3 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/SupermarketSyncService.java @@ -0,0 +1,151 @@ +package com.cowr.service.ssjygl.supermarket; + +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.main.SvrCacheData; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; + +public class SupermarketSyncService extends BaseSyncService { + private static Log log = Log.getLog(SupermarketSyncService.class); + public static SupermarketSyncService me = new SupermarketSyncService(); + + /** + * 加载超市信息缓存 + */ + public void initSupCache() { + SvrCacheData.SUP_CACHE = new HashMap<>(); + List list = Supermarket.dao.findAll(); + for (Supermarket sup : list) { + SvrCacheData.SUP_CACHE.put(sup.getId(), sup); + } + } + + /** + * 给超市添加商品 + * + * @param supermarket_id + * @param product_id + * @param unit_price + * @param sysuser + * @return + */ + public Result addProduct(int supermarket_id, int product_id, double unit_price, Sysuser sysuser) { + Supermarket supermarket = Supermarket.dao.findById(supermarket_id); + + if (supermarket == null) { + return Result.failed("未找到超市信息"); + } + + Product product = Product.dao.findById(product_id); + + if (product == null) { + return Result.failed("未找到商品信息"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = false; + SyncTask synctask = new SyncTask(); + + SupermarketProduct sp = new SupermarketProduct(); + sp.setSupermarketId(supermarket_id); + sp.setProductId(product_id); + sp.setUnitPrice(new BigDecimal(unit_price)); + + ret = sp.save(); + + if(!ret){ + return false; + } + + synctask.addSaveData(sp); + + // 库存初始化 + Stock stock = Stock.dao.findByIds(supermarket_id, product_id); + if(stock == null){ + stock = new Stock(); + stock.setSupermarketId(supermarket_id); + stock.setProductId(product_id); + stock.setStockWeight(new BigDecimal(0)); + + ret = stock.save(); + + synctask.addSaveData(stock); + }else{ + stock.setStockWeight(new BigDecimal(0)); + + ret = stock.update(); + + synctask.addUpdateData(stock); + } + + return ret && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(sp, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return Result.object(ret); + } + + + /** + * 超市移除商品 + * + * @param supermarket_id + * @param product_id + * @param sysuser + * @return + */ + public Result removeProduct(int supermarket_id, int product_id, Sysuser sysuser) { + SupermarketProduct sp = SupermarketProduct.dao.findByIds(supermarket_id, product_id); + + if (sp == null) { + return Result.failed("商品配置信息不存在"); + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = true; + SyncTask synctask = new SyncTask(); + synctask.addDeleteData(sp); + + Stock stock = Stock.dao.findByIds(supermarket_id, product_id); + + if(stock != null){ + stock.setStockWeight(new BigDecimal(0)); + synctask.addUpdateData(stock); + + ret = stock.update(); + } + + return ret && sp.delete() + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(sp, null, Enums.DataOpType.DELETE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return Result.object(ret); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java new file mode 100644 index 0000000..9be8476 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceController.java @@ -0,0 +1,156 @@ +package com.cowr.service.ssjygl.supermarket.receiverdistance; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.SupermarketReceiverDistance; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistancePKValidator; +import com.cowr.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistanceService; +import com.cowr.ssjygl.supermarket.receiverdistance.SupermarketReceiverDistanceValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 21:35:28 CST 2020 + * TableName: supermarket_receiver_distance + * Remarks: 客户收获地址到每个超市的距离 + * PrimaryKey: supermarket_id,customer_receiver_id + */ +public class SupermarketReceiverDistanceController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void checkExistsByPk(){ + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceService.me.checkExistsByPk(model)); + } + + /** + * 新增 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistanceValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceSyncService.me.save(model, tokenuser)); + } + + @Before(SupermarketReceiverDistanceValidator.class) + public void saveOrupdate(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceSyncService.me.saveOrupdate(model, tokenuser)); + } + + /** + * 删除 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistanceValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_receiver_id = getInt("customer_receiver_id"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(SupermarketReceiverDistanceService.me.find(pp, supermarket_id, customer_receiver_id, customer_id))); + } + + /** + * 按主键查找单个对象 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void findByPk(){ + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + @Before(SupermarketReceiverDistancePKValidator.class) + public void get(){ + SupermarketReceiverDistance model = getModel(SupermarketReceiverDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketReceiverDistanceService.me.findByPk(model)); + } + + /** + * 返回所有 supermarket_receiver_distance 客户收获地址到每个超市的距离 + */ + public void list(){ + Integer supermarket_id = getInt("supermarket_id"); + Integer customer_receiver_id = getInt("customer_receiver_id"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(SupermarketReceiverDistanceService.me.list(supermarket_id, customer_receiver_id, customer_id))); + } + + public void findAllSupermarket(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer customer_receiver_id = getInt("customer_receiver_id"); + Integer customer_id = getInt("customer_id"); + renderJson(Result.object(SupermarketReceiverDistanceService.me.findAllSupermarket(pp, customer_receiver_id, customer_id))); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceSyncService.java new file mode 100644 index 0000000..8b69098 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/receiverdistance/SupermarketReceiverDistanceSyncService.java @@ -0,0 +1,56 @@ +package com.cowr.service.ssjygl.supermarket.receiverdistance; + +import com.cowr.common.view.Result; +import com.cowr.model.CustomerReceiver; +import com.cowr.model.Supermarket; +import com.cowr.model.SupermarketReceiverDistance; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.base.BaseSyncService; + +public class SupermarketReceiverDistanceSyncService extends BaseSyncService { + public static SupermarketReceiverDistanceSyncService me = new SupermarketReceiverDistanceSyncService(); + + public Result save(SupermarketReceiverDistance model, Sysuser sysuser){ + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if(supermarket == null){ + return Result.failed("未找到对应超市信息"); + } + + CustomerReceiver cr = CustomerReceiver.dao.findById(model.getCustomerReceiverId()); + + if(cr == null){ + return Result.failed("未找到对应的收获地址信息"); + } + + return super.save(model, sysuser); + } + + /** + * 新增或者更新 + * @param model + * @param sysuser + * @return + */ + public Result saveOrupdate(SupermarketReceiverDistance model, Sysuser sysuser){ + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if(supermarket == null){ + return Result.failed("未找到对应超市信息"); + } + + CustomerReceiver cr = CustomerReceiver.dao.findById(model.getCustomerReceiverId()); + + if(cr == null){ + return Result.failed("未找到对应的收获地址信息"); + } + + SupermarketReceiverDistance old = SupermarketReceiverDistance.dao.findByIds(model.getSupermarketId(), model.getCustomerReceiverId()); + + if(old == null){ + return super.save(model, sysuser); + }else{ + return super.update(model, sysuser); + } + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java new file mode 100644 index 0000000..be14cc8 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceController.java @@ -0,0 +1,134 @@ +package com.cowr.service.ssjygl.supermarket.sandfarmdistance; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.SupermarketSandfarmDistance; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistancePKValidator; +import com.cowr.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistanceService; +import com.cowr.ssjygl.supermarket.sandfarmdistance.SupermarketSandfarmDistanceValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: supermarket_sandfarm_distance + * Remarks: 生产点到销售点的距离配置 + + * PrimaryKey: supermarket_id,sandfarm_id + */ +public class SupermarketSandfarmDistanceController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void checkExistsByPk(){ + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.checkExistsByPk(model)); + } + + /** + * 新增 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + @Before(SupermarketSandfarmDistanceValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.delete(model, tokenuser)); + } + + /** + * 恢复 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.restore(model, tokenuser)); + } + + /** + * 修改 supermarket_sandfarm_distance 生产点到销售点的距离配置 + + */ + @Before(SupermarketSandfarmDistanceValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.update(model, tokenuser)); + } + + /** + * 分页查找 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer supermarket_id = getInt("supermarket_id"); + Integer sandfarm_id = getInt("sandfarm_id"); + renderJson(Result.object(SupermarketSandfarmDistanceService.me.find(pp, supermarket_id, sandfarm_id))); + } + + /** + * 按主键查找单个对象 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void findByPk(){ + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + @Before(SupermarketSandfarmDistancePKValidator.class) + public void get(){ + SupermarketSandfarmDistance model = getModel(SupermarketSandfarmDistance.class, "", true); // 忽略不在model中的字段 + renderJson(SupermarketSandfarmDistanceService.me.findByPk(model)); + } + + /** + * 返回所有 supermarket_sandfarm_distance 生产点到销售点的距离配置 + */ + public void list(){ + renderJson(Result.object(SupermarketSandfarmDistanceService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceSyncService.java new file mode 100644 index 0000000..1eea666 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/sandfarmdistance/SupermarketSandfarmDistanceSyncService.java @@ -0,0 +1,25 @@ +package com.cowr.service.ssjygl.supermarket.sandfarmdistance; + +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.base.BaseSyncService; + +public class SupermarketSandfarmDistanceSyncService extends BaseSyncService { + public static SupermarketSandfarmDistanceSyncService me = new SupermarketSandfarmDistanceSyncService(); + + public Result save(SupermarketSandfarmDistance model, Sysuser sysuser) { + Supermarket supermarket = Supermarket.dao.findById(model.getSupermarketId()); + + if(supermarket == null){ + return Result.failed("未找到对应超市信息"); + } + + Sandfarm sandfarm = Sandfarm.dao.findById(model.getSandfarmId()); + + if(sandfarm == null){ + return Result.failed("未找到对应砂场信息"); + } + + return super.save(model, sysuser); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/stock/StockController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/stock/StockController.java new file mode 100644 index 0000000..f678d99 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/supermarket/stock/StockController.java @@ -0,0 +1,32 @@ +package com.cowr.service.ssjygl.supermarket.stock; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.ssjygl.supermarket.stock.StockService; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Fri Apr 17 16:59:38 CST 2020 + * TableName: stock + * Remarks: 订单相关 - 销售点库存量 + * PrimaryKey: supermarket_id + */ +public class StockController extends Controller { + + /** + * 分页查找 stock 订单相关 - 销售点库存量 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + Integer supermarket_id = getInt("supermarket_id"); + Integer product_id = getInt("product_id"); + renderJson(Result.object(StockService.me.find(pp, supermarket_id, product_id))); + } + + /** + * 返回所有 stock 订单相关 - 销售点库存量 + */ + public void list(){ + renderJson(Result.object(StockService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java new file mode 100644 index 0000000..eaf1251 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/synctask/SyncTaskService.java @@ -0,0 +1,302 @@ +package com.cowr.service.ssjygl.synctask; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.cowr.common.enums.Enums; +import com.cowr.model.*; +import com.cowr.service.ssjygl.main.Config; +import com.cowr.service.ssjygl.main.SvrCacheData; +import com.cowr.ssjygl.CacheData; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Record; + +import java.util.*; + +/** + * Generated by COWR Sat Apr 04 19:57:12 CST 2020 + * TableName: sync_task + * Remarks: 数据同步 + * PrimaryKey: id + */ +public class SyncTaskService { + private static Log log = Log.getLog(SyncTaskService.class); + public static final SyncTaskService me = new SyncTaskService(); + + // 是否开启 + public boolean isEnable() { + return CacheData.service_enable; + } + + /** + * 创建同步日志,并且发送下发数据包 + * + * @param synctask 的 SyncTask + * @return + */ + public boolean save(SyncTask synctask) { + if(!isEnable()){ + return true; + } + + List list = new ArrayList<>(); + + for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { + Supermarket supermarket = entry.getValue(); + + // 只对已经部署了客户端的超市同步数据 + if (supermarket.getIsdeploy() == 0) { + continue; + } + + synctask.setJson(); // 使用逐步加入的数据设置数据 + + synctask.setId(StrKit.getRandomUUID()); + synctask.setSupermarketId(entry.getKey()); + synctask.setCreateTime(new Date()); + + list.add(synctask); + } + + if (list.isEmpty()) { + log.error("没有已部署的超市"); // 没有数据插入的,直接返回 true + + return true; + } else { + int[] ret = Db.batchSave(list, list.size()); + + return ret.length == list.size(); // 有插入的,还是需要返回插入状态 + } + } + + /** + * 向所有客户端广播 + *

+ * 由于有事务控制,必须是正常入库后,才能同步数据,不能在事务未完成前发送 + * + * @param model + */ + public void send(SyncTask model) { + if(!isEnable()){ + return; + } + + JSONObject obj = new JSONObject() + .fluentPut("target", Enums.MsgTarget.SYNCTASK) + .fluentPut("data", model); + + Config.nettyServer.send(model.getSupermarketId(), obj.toJSONString()); + } + + public void syncComplete(String id) { + // TODO 测试完成后,正式运行时,将已同步数据删除。或者将超过一定时间记录删除 + SyncTask synctask = SyncTask.dao.findById(id); + if (synctask != null) { + synctask.setState(1); + boolean ret = synctask.update(); + + if (!ret) { + log.error("synctask 状态更新失败, id: %s", id); + } + } + } + + public void task() { + if(!isEnable()){ + return; + } + + List list = unsynclist(); + + if (!list.isEmpty()) { + log.debug("开始下发未同步完成的数据"); + } + + for (SyncTask obj : list) { + send(obj); + } + } + + public List unsynclist() { + return SyncTask.dao.find("select * from sync_task t where t.state = 0 order by t.create_time limit 0, 500"); + } + + /** + * 接收云端传递过来的数据,入库 + *

+ * 多个表的操作,放到一个 synctask 里面,在接收时,也就可以放在一个事务里面处理了 + * + * @param data + * @param current_supermarket_id 发送数据的 supermarket + * @return + */ + public boolean recv(JSONObject data, int current_supermarket_id) { + if(!isEnable()){ + return true; + } + + long st = System.currentTimeMillis(); + + try { + JSONObject save_data = JSONObject.parseObject(data.getString("save_data")); + JSONObject update_data = JSONObject.parseObject(data.getString("update_data")); + JSONObject delete_data = JSONObject.parseObject(data.getString("delete_data")); + + if ( + (save_data == null || save_data.isEmpty()) + && (update_data == null || update_data.isEmpty()) + && (delete_data == null || delete_data.isEmpty()) + ) { + log.error("同步的数据是空的 %s", data.toJSONString()); + log.debug("recv 1 time: %s", System.currentTimeMillis() - st); + return true; + } + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + JSONArray saveauthlics = new JSONArray(); // 授权车牌号需要推送更新到其他超市 + JSONArray deleteauthlics = new JSONArray(); + + if (save_data != null && !save_data.isEmpty()) { + for (String tablename : save_data.keySet()) { + JSONObject data = save_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray arr = data.getJSONArray("data"); + List list = new ArrayList<>(); + + if (AuthLicense.dao.getTablename().equals(tablename)) { + saveauthlics.addAll(arr); + continue; + } + + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = arr.getJSONObject(i); + + list.add(new Record().setColumns(obj.getInnerMap())); + } + + int[] ret = Db.batchSave(tablename, list, list.size()); + + if (ret.length != list.size()) { + return false; + } + } + } + + if (update_data != null && !update_data.isEmpty()) { + for (String tablename : update_data.keySet()) { + JSONObject data = update_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray arr = data.getJSONArray("data"); + List list = new ArrayList<>(); + + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = arr.getJSONObject(i); + + list.add(new Record().setColumns(obj.getInnerMap())); + } + + int[] ret = Db.batchUpdate(tablename, pks, list, list.size()); + + if (ret.length != list.size()) { + return false; + } + } + } + + if (delete_data != null && !delete_data.isEmpty()) { + for (String tablename : delete_data.keySet()) { + JSONObject data = delete_data.getJSONObject(tablename); + String pks = data.getString("pks"); + JSONArray arr = data.getJSONArray("data"); + + if (AuthLicense.dao.getTablename().equals(tablename)) { + deleteauthlics.addAll(arr); + continue; + } + + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = arr.getJSONObject(i); + + boolean ret = Db.delete(tablename, pks, new Record().setColumns(obj.getInnerMap())); + + if (!ret) { + return false; + } + } + } + } + + if (!saveauthlics.isEmpty() && !deleteauthlics.isEmpty()) { + return recvAuthLicense(saveauthlics, deleteauthlics, current_supermarket_id); + } + + return true; + } catch (Exception e) { + if (e.getMessage().contains("PRIMARY")) { + log.error("主键冲突 %s", data.toJSONString()); + } else if (e.getMessage().contains("Duplicate entry")) { + log.error("重复数据 %s", data.toJSONString()); + } else { + log.error(e.getMessage(), e); + } + + return false; + } + } + }); + + log.debug("recv 2 time: %s", System.currentTimeMillis() - st); + return ret; + } catch (Exception e) { + log.error(e.getMessage(), e); + + log.debug("recv 3 time: %s", System.currentTimeMillis() - st); + return false; + } + } + + /** + * 将收到的 auth_license 转发到其他超市 + * + * @param savearr + * @param deletearr + * @param current_supermarket_id + * @return + */ + public boolean recvAuthLicense(JSONArray savearr, JSONArray deletearr, int current_supermarket_id) { + List sts = new ArrayList<>(); + Date now = new Date(); + + for (Map.Entry entry : SvrCacheData.SUP_CACHE.entrySet()) { + Supermarket supermarket = entry.getValue(); + + // 只对已经部署了客户端的超市同步数据 + // 从下面上报的数据,再广播出去 + if (supermarket.getIsdeploy() == 0 || supermarket.getId() == current_supermarket_id) { + continue; + } + + SyncTask synctask = new SyncTask(); + synctask.setId(StrKit.getRandomUUID()); + synctask.setSaveData(JSONObject.toJSONString(new JSONObject().put(AuthLicense.dao.getTablename(), savearr))); + synctask.setDeleteData(JSONObject.toJSONString(new JSONObject().put(AuthLicense.dao.getTablename(), deletearr))); + synctask.setSupermarketId(supermarket.getId()); + synctask.setCreateTime(now); + + sts.add(synctask); + } + + if (!sts.isEmpty()) { + int[] ret = Db.batchSave(sts, sts.size()); + + return ret.length == sts.size(); + } + + return true; + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserController.java new file mode 100644 index 0000000..c5a4970 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserController.java @@ -0,0 +1,142 @@ +package com.cowr.service.ssjygl.system.sysuser; + +import com.cowr.common.Const; +import com.cowr.common.utils.StrUtil; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Sysuser; +import com.cowr.service.ssjygl.main.AuthInterceptor; +import com.cowr.ssjygl.system.sysuser.SysuserPKValidator; +import com.cowr.ssjygl.system.sysuser.SysuserValidator; +import com.jfinal.aop.Before; +import com.jfinal.aop.Clear; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Tue Jun 25 00:41:56 CST 2019 + * TableName: sysuser + * Remarks: + * PrimaryKey: id + */ +public class SysuserController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(SysuserPKValidator.class) + public void checkExistsByPk(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.checkExistsByPk(model)); + } + + /** + * 新增 sysuser + */ + @Before(SysuserValidator.class) + public void save(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.save(model)); + } + + /** + * 删除 sysuser + */ + @Before(SysuserPKValidator.class) + public void del(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.delete(model)); + } + + /** + * 恢复 sysuser + */ + @Before(SysuserPKValidator.class) + public void restore(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.restore(model)); + } + + /** + * 修改 sysuser + */ + @Before(SysuserValidator.class) + public void edit(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.update(model)); + } + + /** + * 分页查找 sysuser + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name", ""); + String phone = get("phone", ""); + Integer del = getInt("del", Const.LOGIC_DEL_VALID); // 默认显示未删除的 + Integer type = getInt("type"); + Integer entity_id = getInt("entity_id"); + renderJson(Result.object(SysuserService.me.find(pp, name, phone, del, type, entity_id))); + } + + /** + * 按主键查找单个对象 sysuser + */ + @Before(SysuserPKValidator.class) + public void findByPk(){ + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.findByPk(model)); + } + + @Clear(AuthInterceptor.class) + public void login(){ + String name = get("name", "").trim(); + String phone = get("phone", "").trim(); + String password = get("password", ""); + + renderJson(SysuserService.me.login(name, phone, password)); + } + + /** + * 检查手机号是否已经存在 + */ + public void checkPhone(){ + String phone = get("phone", ""); + + // 先判断手机号是否符合格式要求,然后再判断数据库是否已经存在 + if(!StrUtil.isPhone(phone)){ + renderJson(Result.success(false)); + }else{ + renderJson(Result.success(SysuserService.me.checkPhone(phone))); + } + } + + /** + * 修改密码 + */ + public void modpwd(){ + String token = get("token", ""); + String oldpwd = get("oldpwd", ""); + String newpwd = get("newpwd", ""); + + renderJson(SysuserService.me.updatePassword(token, oldpwd, newpwd)); + } + + /** + * 按主键查找单个对象 sysuser + */ + @Before(SysuserPKValidator.class) + public void resetpwd(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Sysuser model = getModel(Sysuser.class, "", true); // 忽略不在model中的字段 + renderJson(SysuserService.me.resetPassword(model, tokenuser)); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserService.java new file mode 100644 index 0000000..748b7bc --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/system/sysuser/SysuserService.java @@ -0,0 +1,568 @@ +package com.cowr.service.ssjygl.system.sysuser; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseModel; +import com.cowr.common.base.BaseService; +import com.cowr.common.enums.UserTypeEnum; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.main.Config; +import com.jfinal.kit.HashKit; +import com.jfinal.kit.StrKit; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; +import com.jfinal.plugin.redis.Redis; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * Generated by COWR Tue Jun 25 00:41:56 CST 2019 + * TableName: sysuser + * Remarks: + * PrimaryKey: id + */ +public class SysuserService extends BaseService { + private static Log log = Log.getLog(SysuserService.class); + private static final String pwdkey = "sysuser"; + public static final String tablename = "sysuser"; + public static final SysuserService me = new SysuserService(); + private static final Pattern rolepattern = Pattern.compile("[0-2]{3}"); + // private static int expireAt = 24 * 60 * 60; // 超时时间,单位秒 + private static int expireAt = 24 * 60 * 60; // 超时时间,单位秒 + + public String redisbasekey() { + return Config.dbprop.get("redis.basekey") + Const.REDIS_SEPARATE + tablename + Const.REDIS_SEPARATE; + } + + public String tokenrediskey(String token) { + return redisbasekey() + "token" + Const.REDIS_SEPARATE + token; + } + + /** + * 是否是超市管理员 + * + * @param roleid + * @return + */ + public boolean isSuperAdmin(Integer roleid) { + if (roleid == null) return false; + String rolestr = roleid.toString(); + return rolepattern.matcher(rolestr).matches() && "1".equals(rolestr.substring(0, 1)) && "0".equals(rolestr.substring(2, 3)); + } + + /** + * 是否是超市管理调度 + * + * @param roleid + * @return + */ + public boolean isSuperCtrl(Integer roleid) { + if (roleid == null) return false; + String rolestr = roleid.toString(); + return rolepattern.matcher(rolestr).matches() && "1".equals(rolestr.substring(0, 1)) && "1".equals(rolestr.substring(2, 3)); + } + + /** + * 是否是超市装载员 + * + * @param roleid + * @return + */ + public boolean isSuperStevedore(Integer roleid) { + if (roleid == null) return false; + String rolestr = roleid.toString(); + return rolepattern.matcher(rolestr).matches() && "1".equals(rolestr.substring(0, 1)) && "2".equals(rolestr.substring(2, 3)); + } + + /** + * 2020-03-7 财务和总经理,必须选超市管理员? + * 是否是财务人员 + * + * @param roleid + * @return + */ + public boolean isTreasurer(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(501); + } + + /** + * 2020-03-7 财务和总经理,必须选超市管理员? + * 是否是财务人员 + * + * @param roleid + * @return + */ + public boolean isPresident(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(500); + } + + public boolean isPresidentView(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(502); + } + + /** + * 是否是物流公司管理员 + * + * @param roleid + * @return + */ + public boolean isTrancoAdmin(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(201); + } + + /** + * 是否是司机 + * + * @param roleid + * @return + */ + public boolean isTrancoDriver(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(202); + } + + public boolean isConfigAdmin(Integer roleid) { + if (roleid == null) return false; + return roleid.equals(99); + } + + /** + * 生成token + * + * @param model + * @return + */ + public String getToken(Sysuser model) { + return StrKit.getRandomUUID(); + } + + /** + * 生成密码MD5 + * + * @param phone + * @param password + * @return 手机号已存在,返回 true,否则返回 false + */ + public String getPwdMD5(String phone, String password) { + return HashKit.md5(phone + password + pwdkey); + } + + public boolean checkPhone(String phone) { + try { + return Sysuser.dao.findFirst("select * from sysuser where phone = ?", phone) != null; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + private BaseModel checkEntityId(Sysuser model) { + if (model.getType() == null || !UserTypeEnum.hasTypeId(model.getType())) { + return null; + } + + if (model.getEntityId() != null) { + BaseModel baseModel = null; + + switch (UserTypeEnum.getUserType(model.getType())) { // 前面必须对 type 做必填、int验证,保障这里不报空指针 + case SUPERMARKET: + baseModel = Supermarket.dao.findById(model.getEntityId()); + break; + case TRANSCO: + baseModel = TransportCompany.dao.findById(model.getEntityId()); + break; + case CUSTOMER: + baseModel = Customer.dao.findById(model.getEntityId()); + break; + case DRIVER: + baseModel = Driver.dao.findById(model.getEntityId()); + break; + } + + return baseModel; + } + + return null; + } + + /** + * 已经做好相应的验证了 + * 多次使用的方法 + * 如果已经验证好了,不必要的验证就可以跳过了 + * + * @param model + * @return + */ + public boolean saveModel(Sysuser model) { + model.setPassword(getPwdMD5(model.getPhone(), Const.DEFAULT_PASSWORD)); + model.remove("id"); // 避免前端传 id + + return model.save(); + } + + /** + * 新增 + * 设置默认密码 + * + * @param model BaseModel + * @return Result + */ + public Result save(Sysuser model) { + try { + if (model.checkDuplicate("phone")) { + return Result.failed(false, "手机号已存在"); + } + + if (model.getType() == null || !UserTypeEnum.hasTypeId(model.getType())) { + return Result.failed(false, "type 必填"); + } + + if (model.getType() != null && UserTypeEnum.DRIVER.getTypeid().equals(model.getType())) { + return Result.failed(false, "不能直接在账号内添加司机"); + } + + if (!isTreasurer(model.getRole()) && !isPresident(model.getRole()) && !isConfigAdmin(model.getRole())) { + // 不是财务、经理的时候,按照原来的规则检查 + if (checkEntityId(model) == null) { + return Result.failed(false, "entity_id 未找到对应值"); + } + } + + boolean ret = saveModel(model); + + if (ret) { + model.setPassword(null); + + return Result.object(model); + } + + return Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } + if (e.getMessage().contains("Duplicate entry")) { + return Result.failed(false, "存在重复数据"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + /** + * 修改 + * + * @param model BaseModel + * @return Result + */ + public Result update(Sysuser model) { + try { + Sysuser old = model.findByColumns("phone"); + Sysuser chkobj = model.findByPk(); // 按 id 找到旧的对象 + + // 注意这里有 !,找到后才做 update 操作 + if (chkobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + model.setType(chkobj.getType()); // type 不让修改 + + // 按手机号查出来的记录,不的当前更新的记录 + if (old != null && !old.getId().equals(model.getId())) { + return Result.failed(false, "手机号已存在"); + } + + BaseModel baseModel = checkEntityId(model); + + if (isTreasurer(model.getRole()) || isPresident(model.getRole())) { + if (model.getEntityId() == null) { // 没有从前端获取到 entity_id + model.setEntityId(null); // 如果不设置,upate 时,不会更新 entity_id, 如果要清空 entity_id 值,就需要手动设置为 null + } + } else { + // 不是财务、经理的时候,按照原来的规则检查 + if (baseModel == null) { + return Result.failed(false, "entity_id 未找到对应值"); + } + } + + model.remove("password"); // 更新用户信息,不更新密码 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() throws SQLException { + boolean ret = model.update(); + + // 如果是司机,需要更新司机信息 +// if (ret && chkobj.getType() != null && chkobj.getType().equals(UserTypeEnum.DRIVER.getTypeid()) && baseModel != null) { +// // 目前暂时只更新姓名、手机号 +// +// Driver olddriver = (Driver)baseModel; +// +// olddriver.setName(model.getName()); +// olddriver.setPhone(model.getPhone()); +// +// ret = olddriver.update(); +// } + + return ret; + } + }); + + return ret ? Result.object(model) : Result.failed(false, "编辑失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "主键冲突"); + } + if (e.getMessage().contains("Duplicate entry")) { + return Result.failed(false, "存在重复数据"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + + /** + * 恢复被逻辑删除的数据 + * + * @param model + * @return + */ + public Result restore(BaseModel model) { + try { + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_VALID); // 逻辑删除字段统一用 del + + boolean ret = model.update(); + + Sysuser sysuser = Sysuser.dao.findById(model.get("id")); + + sysuser.remove("password"); + + return ret ? Result.object(sysuser) : Result.failed(false, "恢复失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "恢复失败"); + } + } + + /** + * 用户修改相关提示信息会少一点 + * 避免别人试错 + * + * @param token + * @param oldpwd + * @param newpwd + * @return + */ + public Result updatePassword(String token, String oldpwd, String newpwd) { + try { + Sysuser tokenuser = getSysuserByToken(token); // 用 token 获取到的用户没有密码 + + if (tokenuser == null) { + return Result.failed(false, "修改失败"); + } + + Sysuser sysuser = Sysuser.dao.findById(tokenuser.getId()); // 需要再从数据库中查询一次 + + String oldmd5 = getPwdMD5(sysuser.getPhone(), oldpwd); + + if (!sysuser.getPassword().equals(oldmd5)) { + return Result.failed(false, "修改失败"); + } + + String newmd5 = getPwdMD5(sysuser.getPhone(), newpwd); + + sysuser.setPassword(newmd5); + + boolean ret = sysuser.update(); + + sysuser.remove("password"); + + return ret ? Result.object(sysuser) : Result.failed(false, "修改失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "修改失败"); + } + } + + + /** + * 重置密码 + * + * @param model 被修改的用户,只要id + * @param adminuser 验证当前用户是否是管理员 + * @return + */ + public Result resetPassword(Sysuser model, Sysuser adminuser) { + try { + // TODO 判断权限,若权限修改,这里也要调整 +// if (adminuser == null +// || !adminuser.getType().equals(UserTypeEnum.SUPERMARKET.getTypeid()) // 判断是否是砂场用户 +// || !adminuser.getRole().equals(RoleEnum.SUPERADMIN.getRoleid())) { // 判断是否是砂场管理员 +// return Result.permissionDenied(); +// } + + Sysuser sysuser = Sysuser.dao.findById(model.getId()); // 需要再从数据库中查询一次 + + if (sysuser == null) { + return Result.failed(false, "重置失败"); + } + + sysuser.setPassword(getPwdMD5(sysuser.getPhone(), Const.DEFAULT_PASSWORD)); + + boolean ret = sysuser.update(); + + sysuser.remove("password"); + + return ret ? Result.object(sysuser) : Result.failed(false, "重置失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "重置失败"); + } + } + + public Sysuser getUserByWhere(String name, String phone, String password) { + Sysuser sysuser = Sysuser.dao.findFirst("select * from sysuser where phone = ? and del = 0", phone); + + if (sysuser == null && StrKit.notBlank(name)) { + log.debug("按手机号未找到用户"); + sysuser = Sysuser.dao.findFirst("select * from sysuser where name = ? and del = 0", name); + } + + if (sysuser == null) { + log.debug("按姓名未找到用户"); + return null; + } + + String pwdmd5 = getPwdMD5(sysuser.getPhone(), password); + + if (!sysuser.getPassword().equals(pwdmd5)) { + log.debug("密码错误"); + return null; + } + + return sysuser; + } + + /** + * 登陆 + * 返回信息只写登陆失败,避免试错 + * + * @param name + * @param phone + * @param password + * @return + */ + public Result login(String name, String phone, String password) { + try { + Sysuser sysuser = getUserByWhere(name, phone, password); + + if (sysuser == null) { + return Result.failed(false, "登陆失败"); + } + + if (!isConfigAdmin(sysuser.getRole()) + && !isPresident(sysuser.getRole()) + && !isPresidentView(sysuser.getRole()) + && !isTreasurer(sysuser.getRole()) + ) { + return Result.permissionDenied(); + } + + sysuser.setPassword(null); + String token = getToken(sysuser); + + Record out = new Record(); + out.set("tm", System.currentTimeMillis()); + out.set("user", sysuser); + + Redis.use().setex(tokenrediskey(token), expireAt, sysuser); + + return Result.success(new AuthResult(token, sysuser)); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "登陆失败"); + } + } + + /** + * 使用 token 从缓存中获取用户信息 + * + * @param token + * @return + */ + public Sysuser getSysuserByToken(String token) { + Sysuser sysuser = Redis.use().get(tokenrediskey(token)); + + if (sysuser != null) { + Redis.use().setex(tokenrediskey(token), expireAt, sysuser); // 刷新token + } + + return sysuser; + } + + public Page find(PageParam pp, String name, String phone, Integer del, Integer type, Integer entity_id) { + StringBuilder sqlbuf = new StringBuilder(); + sqlbuf.append(" from (\n"); + sqlbuf.append("select \n"); + sqlbuf.append(" u.id, u.phone, u.name, u.type, u.role, u.del\n"); + sqlbuf.append(" , case when u.type = 4 then d.trans_co_id else u.entity_id end entity_id\n"); + sqlbuf.append(" , case when u.type = 1 then s.name end supermarket_name \n"); + sqlbuf.append(" , case when u.type = 2 then t.name when u.type = 4 then t2.name end trans_co_name \n"); + sqlbuf.append(" , case when u.type = 3 then c.name end customer_name\n"); + sqlbuf.append(" , case when u.type = 4 then d.id end driver_id\n"); + sqlbuf.append(" from sysuser u \n"); + sqlbuf.append(" left join supermarket s on u.entity_id = s.id \n"); + sqlbuf.append(" left join transport_company t on u.entity_id = t.id \n"); + sqlbuf.append(" left join driver d on u.entity_id = d.id\n"); + sqlbuf.append(" left join transport_company t2 on d.trans_co_id = t2.id \n"); + sqlbuf.append(" left join customer c on u.entity_id = c.id\n"); + sqlbuf.append(") a\n"); + sqlbuf.append("where 1 = 1"); + List paraList = new ArrayList<>(); + + if (StrKit.notBlank(name)) { + sqlbuf.append(" and a.name like ? \n"); + paraList.add("%" + name + "%"); + } + + if (StrKit.notBlank(phone)) { + sqlbuf.append(" and a.phone like ? \n"); + paraList.add("%" + phone + "%"); + } + + if (del != null && (del == Const.LOGIC_DEL_VALID || del == Const.LOGIC_DEL_INVALID)) { + sqlbuf.append(" and a.del = ? \n"); + paraList.add(del); + } + + if (type != null && type > 0) { + sqlbuf.append(" and a.type = ? \n"); + paraList.add(type); + } + + if (entity_id != null && entity_id > 0) { + sqlbuf.append(" and a.entity_id = ? \n"); + paraList.add(entity_id); + } + + return Db.paginate(pp.getPage(), pp.getSize(), "select * ", sqlbuf.toString(), paraList.toArray()); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanyController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanyController.java new file mode 100644 index 0000000..a052010 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanyController.java @@ -0,0 +1,132 @@ +package com.cowr.service.ssjygl.transportcompany; + +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Sysuser; +import com.cowr.model.TransportCompany; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.transportcompany.TransportCompanyPKValidator; +import com.cowr.ssjygl.transportcompany.TransportCompanyService; +import com.cowr.ssjygl.transportcompany.TransportCompanyValidator; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: transport_company + * Remarks: 物流公司 + * PrimaryKey: id + */ +public class TransportCompanyController extends Controller { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(TransportCompanyPKValidator.class) + public void checkExistsByPk(){ + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanyService.me.checkExistsByPk(model)); + } + + /** + * 新增 transport_company 物流公司 + */ + @Before(TransportCompanyValidator.class) + public void save(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanySyncService.me.save(model, tokenuser)); + } + + /** + * 删除 transport_company 物流公司 + */ + @Before(TransportCompanyPKValidator.class) + public void del(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanySyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 transport_company 物流公司 + */ + @Before(TransportCompanyPKValidator.class) + public void restore(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanySyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 transport_company 物流公司 + */ + @Before(TransportCompanyValidator.class) + public void edit(){ + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanySyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 transport_company 物流公司 + */ + public void find(){ + PageParam pp = getBean(PageParam.class, "", true); + String name = get("name"); + Integer del = getInt("del"); + renderJson(Result.object(TransportCompanyService.me.find(pp, name, del))); + } + + /** + * 按主键查找单个对象 transport_company 物流公司 + */ + @Before(TransportCompanyPKValidator.class) + public void findByPk(){ + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanyService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 transport_company 物流公司 + */ + @Before(TransportCompanyPKValidator.class) + public void get(){ + TransportCompany model = getModel(TransportCompany.class, "", true); // 忽略不在model中的字段 + renderJson(TransportCompanyService.me.findByPk(model)); + } + + /** + * 返回所有 transport_company 物流公司 + */ + public void list(){ + renderJson(Result.object(TransportCompanyService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanySyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanySyncService.java new file mode 100644 index 0000000..d20c48a --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/transportcompany/TransportCompanySyncService.java @@ -0,0 +1,7 @@ +package com.cowr.service.ssjygl.transportcompany; + +import com.cowr.service.ssjygl.base.BaseSyncService; + +public class TransportCompanySyncService extends BaseSyncService { + public static TransportCompanySyncService me = new TransportCompanySyncService(); +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckController.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckController.java new file mode 100644 index 0000000..c103f56 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckController.java @@ -0,0 +1,137 @@ +package com.cowr.service.ssjygl.truck; + +import com.cowr.common.base.BaseController; +import com.cowr.common.view.PageParam; +import com.cowr.common.view.Result; +import com.cowr.model.Sysuser; +import com.cowr.model.Truck; +import com.cowr.service.ssjygl.system.sysuser.SysuserService; +import com.cowr.ssjygl.truck.TruckPKValidator; +import com.cowr.ssjygl.truck.TruckService; +import com.cowr.ssjygl.truck.TruckValidator; +import com.jfinal.aop.Before; + +/** + * Generated by COWR Mon Apr 06 09:50:28 CST 2020 + * TableName: truck + * Remarks: 运输车辆信息 + * PrimaryKey: license + */ +public class TruckController extends BaseController { + + /** + * 按主键检查对象是否存在 + * 返回 code = 200 + * 存在时 data = true + * 不存在 data = false + */ + @Before(TruckPKValidator.class) + public void checkExistsByPk() { + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckService.me.checkExistsByPk(model)); + } + + /** + * 新增 truck 运输车辆信息 + */ + @Before(TruckValidator.class) + public void save() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckSyncService.me.save(model, tokenuser)); + } + + /** + * 删除 truck 运输车辆信息 + */ + @Before(TruckPKValidator.class) + public void del() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckSyncService.me.delete(model, tokenuser)); + } + + /** + * 恢复 truck 运输车辆信息 + */ + @Before(TruckPKValidator.class) + public void restore() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckSyncService.me.restore(model, tokenuser)); + } + + /** + * 修改 truck 运输车辆信息 + */ + @Before(TruckValidator.class) + public void edit() { + Sysuser tokenuser = SysuserService.me.getSysuserByToken(get("token")); + + if (tokenuser == null) { + renderJson(Result.noauth()); + return; + } + + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckSyncService.me.update(model, tokenuser)); + } + + /** + * 分页查找 truck 运输车辆信息 + */ + public void find() { + PageParam pp = getBean(PageParam.class, "", true); + String license = getUpperCaseVal("license"); + Integer trans_co_id = getInt("trans_co_id"); + Integer state = getInt("trans_co_id"); + String gps = get("gps"); + String sim = get("sim"); + Integer del = getInt("trans_co_id"); + String number = get("number"); + renderJson(Result.object(TruckService.me.find(pp, license, trans_co_id, state, gps, sim, del, number))); + } + + /** + * 按主键查找单个对象 truck 运输车辆信息 + */ + @Before(TruckPKValidator.class) + public void findByPk() { + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckService.me.findByPk(model)); + } + + /** + * 按主键查找单个对象 truck 运输车辆信息 + */ + @Before(TruckPKValidator.class) + public void get() { + Truck model = getModel(Truck.class, "", true); // 忽略不在model中的字段 + renderJson(TruckService.me.findByPk(model)); + } + + /** + * 返回所有 truck 运输车辆信息 + */ + public void list() { + renderJson(Result.object(TruckService.me.list())); + } +} diff --git a/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java new file mode 100644 index 0000000..604e72c --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/com/cowr/service/ssjygl/truck/TruckSyncService.java @@ -0,0 +1,188 @@ +package com.cowr.service.ssjygl.truck; + +import com.cowr.common.Const; +import com.cowr.common.base.BaseModel; +import com.cowr.common.enums.Enums; +import com.cowr.common.view.Result; +import com.cowr.model.*; +import com.cowr.service.ssjygl.base.BaseSyncService; +import com.cowr.service.ssjygl.synctask.SyncTaskService; +import com.cowr.ssjygl.modifylog.ModifyLogService; +import com.jfinal.log.Log; +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.IAtom; + +public class TruckSyncService extends BaseSyncService { + public static TruckSyncService me = new TruckSyncService(); + private static Log log = Log.getLog(TruckSyncService.class); + + public Result save(Truck model, Sysuser sysuser) { + int trans_co_id = model.getTransCoId(); + TransportCompany tco = TransportCompany.dao.findById(trans_co_id); + + if(tco == null){ + return Result.failed("未找到对应物流公司信息"); + } + + try { + // 注意这里,按主键未找到才做 save 操作 + if (model.checkExistsByPk()) { + return Result.failed(false, "车牌号已经存在,或者已标记为已删除"); + } + + SyncTask synctask = new SyncTask(); + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(model.getLicense()); + + synctask.addSaveData(authlic); // 逻辑删除车辆时,有效车牌要删除 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.save(); + + synctask.addSaveData(model); // 在保存后添加 + + return ret + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, null, Enums.DataOpType.SAVE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + return ret ? Result.object(model) : Result.failed(false, "新增失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + if (e.getMessage().contains("PRIMARY")) { + return Result.failed(false, "车牌号已经存在,或者已标记为已删除"); + } else { + return Result.failed(false, e.getMessage()); + } + } + } + + public Result update(Truck model, Sysuser sysuser) { + int trans_co_id = model.getTransCoId(); + TransportCompany tco = TransportCompany.dao.findById(trans_co_id); + + if(tco == null){ + return Result.failed("未找到对应物流公司信息"); + } + + return super.update(model, sysuser); + } + + /** + * 车辆有逻辑删除 + * @param model + * @param sysuser + * @return + */ + public Result delete(Truck model, Sysuser sysuser){ + try { + // 注意这里有 !,找到后才做 update 操作 + BaseModel oldobj = (BaseModel) model.findByPk(); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_INVALID); // 逻辑删除字段统一用 del + + SyncTask synctask = new SyncTask(); + synctask.addUpdateData(model); + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(model.getLicense()); + + synctask.addDeleteData(authlic); // 逻辑删除车辆时,有效车牌要删除 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + return model.update() + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, oldobj, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + // 将修改后的对象返回 + String[] keys = model._getAttrNames(); + for (String key : keys) { + oldobj.set(key, model.get(key)); + } + + return ret ? Result.object(oldobj) : Result.failed(false, "删除失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "删除失败"); + } + } + + public Result restore(Truck model, Sysuser sysuser){ + try { + // 注意这里有 !,找到后才做 update 操作 + BaseModel oldobj = (BaseModel) model.findByPk(); + + if (oldobj == null) { + return Result.failed(false, "按主键未找到对应记录"); + } + + if (!model.hasDelKey()) { + return Result.failed(false, "不存在逻辑删除字段"); + } + + model.set(Const.LOGIC_DEL_KEY, Const.LOGIC_DEL_VALID); // 逻辑删除字段统一用 del + + SyncTask synctask = new SyncTask(); + + AuthLicense authlic = new AuthLicense(); + authlic.setTruckLicense(model.getLicense()); + + synctask.addSaveData(authlic); // 恢复车辆时,有效车牌要添加 + + boolean ret = Db.tx(new IAtom() { + @Override + public boolean run() { + try { + boolean ret = model.update(); + + synctask.addUpdateData(model); + + return ret + && SyncTaskService.me.save(synctask) + && ModifyLogService.me.save(model, oldobj, Enums.DataOpType.UPDATE.getId(), sysuser); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + }); + + // 将修改后的对象返回 + String[] keys = model._getAttrNames(); + for (String key : keys) { + oldobj.set(key, model.get(key)); + } + + return ret ? Result.object(oldobj) : Result.failed(false, "恢复失败"); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.failed(false, "恢复失败"); + } + } +} diff --git a/ssjygl-xsx-service/src/main/resources/dev/config.properties b/ssjygl-xsx-service/src/main/resources/dev/config.properties new file mode 100644 index 0000000..45153af --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/dev/config.properties @@ -0,0 +1,12 @@ +devMode=true + +#打印用到的配置信息 +print.vendor=湖北 +print.vendorTaxId=9142 + +#起步运输距离 +start.trans.distance=5 + +#本地服务 和 云端服务 socket 通信 +socketserver.enable=false +socketserver.port=21002 \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/resources/dev/db.properties b/ssjygl-xsx-service/src/main/resources/dev/db.properties new file mode 100644 index 0000000..c183203 --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/dev/db.properties @@ -0,0 +1,11 @@ +# mysql +jdbcUrl=jdbc:mysql://rm-wz9wa070076b2uge2ro.mysql.rds.aliyuncs.com:3306/ssjy_xsx_dev?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true +user=ssjy_xsx +password=Ssjy_xs_890 + +# redis +redis.basekey = ssjcgl_xsx_dev +redis.ip=r-wz9168ab2f2f7ec4pd.redis.rds.aliyuncs.com +redis.port=6379 +redis.pwd=CoWR1111 +redis.db=13 \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/resources/dev/undertow.txt b/ssjygl-xsx-service/src/main/resources/dev/undertow.txt new file mode 100644 index 0000000..f1fd09e --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/dev/undertow.txt @@ -0,0 +1,14 @@ + +undertow.devMode=true +#使用6位县级行政区划编码的后4位,开发的前面补3 +undertow.port=20002 +undertow.host=0.0.0.0 + +# 开启 gzip 压缩 +undertow.gzip.enable=true + + + + + + diff --git a/ssjygl-xsx-service/src/main/resources/job.properties b/ssjygl-xsx-service/src/main/resources/job.properties new file mode 100644 index 0000000..3cd4be1 --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/job.properties @@ -0,0 +1,5 @@ + +#.job 部分前面不能以 job结尾 +synctask.job=com.cowr.service.ssjygl.jobs.SyncJob +synctask.cron= 0 * * * * ? +synctask.enable=false \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/resources/log4j.properties b/ssjygl-xsx-service/src/main/resources/log4j.properties new file mode 100644 index 0000000..e64bad2 --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/log4j.properties @@ -0,0 +1,77 @@ +# 日志级别 +log4j.rootLogger=DEBUG, console, fileDebug, fileInfo +log4j.rootLogger.encoding=UTF-8 +log4j.logger.com.cowr=DEBUG +log4j.logger.com.jfinal=DEBUG +log4j.logger.io.undertow=WARN +log4j.logger.io.netty=WARN +log4j.logger.org=WARN +log4j.logger.com=WARN +log4j.logger.com.alibaba.druid=WARN +log4j.logger.net=WARN +log4j.logger.javax=WARN +log4j.logger.SYSTEM=DEBUG + +# 输出到控制台 +log4j.appender.Threshold=DEBUG +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.encoding=UTF-8 +log4j.appender.console.layout=org.apache.log4j.PatternLayout +#log4j.appender.console.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n +log4j.appender.console.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n +#由于使用了 undertow 运行程序,配置相对路径存放日志文件 +#若使用 tomcat 可以用 tomcat 环境变量 ${catalina.home} 作为日志文件根目录 + +# 输出到文件 debug +log4j.appender.fileDebug=org.apache.log4j.RollingFileAppender +log4j.appender.fileDebug.encoding=UTF-8 +log4j.appender.fileDebug.Append=true +log4j.appender.fileDebug.Threshold=DEBUG +log4j.appender.fileDebug.File=../logs/ssjygl.xsx.service.debug.log +log4j.appender.fileDebug.MaxFileSize=10MB +log4j.appender.fileDebug.MaxBackupIndex=1000 +log4j.appender.fileDebug.layout=org.apache.log4j.PatternLayout +log4j.appender.fileDebug.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %X{traceId}%n + +# 输出到文件 info +log4j.appender.fileInfo=org.apache.log4j.RollingFileAppender +log4j.appender.fileInfo.encoding=UTF-8 +log4j.appender.fileInfo.Append=true +log4j.appender.fileInfo.Threshold=INFO +log4j.appender.fileInfo.File=../logs/ssjygl.xsx.service.info.log +log4j.appender.fileInfo.MaxFileSize=10MB +log4j.appender.fileInfo.MaxBackupIndex=500 +log4j.appender.fileInfo.layout=org.apache.log4j.PatternLayout +log4j.appender.fileInfo.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %t %F %L - %M %m %n + +# ConversionPattern参数的格式含义 +# 格式名 含义 +# %c 输出日志信息所属的类的全名 +# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28 +# %f 输出日志信息所属的类的类名 +# %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 +# %m 输出代码中指定的信息,如log(message)中的message +# %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” +# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 +# %r 输出自应用启动到输出该日志信息所耗费的毫秒数 +# %t 输出产生该日志事件的线程名 + + +# nettyclient 日志 +log4j.additivity.com.cowr.service.ssjygl.netty=false +log4j.logger.com.cowr.service.ssjygl.netty=DEBUG, nettyclientFile, nettyclientConsole +log4j.appender.nettyclientFile=org.apache.log4j.RollingFileAppender +log4j.appender.nettyclientFile.encoding=UTF-8 +log4j.appender.nettyclientFile.Append=true +log4j.appender.nettyclientFile.Threshold=DEBUG +log4j.appender.nettyclientFile.File=../logs/ssjygl.xsx.nettyclient.log +log4j.appender.nettyclientFile.MaxFileSize=10MB +log4j.appender.nettyclientFile.MaxBackupIndex=1000 +log4j.appender.nettyclientFile.layout=org.apache.log4j.PatternLayout +log4j.appender.nettyclientFile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss.SSS} %p %F %L - %M %m %X{traceId}%n + +log4j.appender.nettyclientConsole.Threshold=DEBUG +log4j.appender.nettyclientConsole=org.apache.log4j.ConsoleAppender +log4j.appender.nettyclientConsole.encoding=UTF-8 +log4j.appender.nettyclientConsole.layout=org.apache.log4j.PatternLayout +log4j.appender.nettyclientConsole.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%p][%l]: %m%n \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/resources/logging.properties b/ssjygl-xsx-service/src/main/resources/logging.properties new file mode 100644 index 0000000..91ba645 --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/logging.properties @@ -0,0 +1,13 @@ +handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +org.apache.juli.FileHandler.level = FINE +org.apache.juli.FileHandler.directory = ${log.base}/logs +org.apache.juli.FileHandler.prefix = error-debug. + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter diff --git a/ssjygl-xsx-service/src/main/resources/prod/config.properties b/ssjygl-xsx-service/src/main/resources/prod/config.properties new file mode 100644 index 0000000..1656e1a --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/prod/config.properties @@ -0,0 +1,12 @@ +devMode=true + +#打印用到的配置信息 +print.vendor=湖北齐安坤源矿业有限公司 +print.vendorTaxId=91421100MA49BNY95J + +#起步运输距离 +start.trans.distance=5 + +#本地服务 和 云端服务 socket 通信 +socketserver.enable=false +socketserver.port=21002 \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/resources/prod/db.properties b/ssjygl-xsx-service/src/main/resources/prod/db.properties new file mode 100644 index 0000000..b3a90a3 --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/prod/db.properties @@ -0,0 +1,11 @@ +# mysql +jdbcUrl=jdbc:mysql://rm-wz9wa070076b2uge2ro.mysql.rds.aliyuncs.com:3306/ssjy_xsx_dev?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&serverTimezone=GMT%2B8&autoReconnect=true +user=ssjy_xsx +password=Ssjy_xs_890 + +# redis +redis.basekey = ssjcgl_xsx +redis.ip=192.168.0.219 +redis.port=6379 +redis.pwd= +redis.db= \ No newline at end of file diff --git a/ssjygl-xsx-service/src/main/resources/prod/undertow.txt b/ssjygl-xsx-service/src/main/resources/prod/undertow.txt new file mode 100644 index 0000000..f1fd09e --- /dev/null +++ b/ssjygl-xsx-service/src/main/resources/prod/undertow.txt @@ -0,0 +1,14 @@ + +undertow.devMode=true +#使用6位县级行政区划编码的后4位,开发的前面补3 +undertow.port=20002 +undertow.host=0.0.0.0 + +# 开启 gzip 压缩 +undertow.gzip.enable=true + + + + + + diff --git a/ssjygl-xsx-service/src/main/webapp/WEB-INF/web.xml b/ssjygl-xsx-service/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..9f88c1f --- /dev/null +++ b/ssjygl-xsx-service/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,7 @@ + + + + Archetype Created Web Application + diff --git a/ssjygl-xsx-service/src/main/webapp/index.jsp b/ssjygl-xsx-service/src/main/webapp/index.jsp new file mode 100644 index 0000000..c38169b --- /dev/null +++ b/ssjygl-xsx-service/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/ssjygl-xsx-service/start.bat b/ssjygl-xsx-service/start.bat new file mode 100644 index 0000000..2da5455 --- /dev/null +++ b/ssjygl-xsx-service/start.bat @@ -0,0 +1,40 @@ +@echo off + +chcp 65001 + +rem ------------------------------------------------------------------------- +rem +rem 使用说明: +rem +rem 1: 该脚本用于别的项目时只需要修改 MAIN_CLASS 即可运行 +rem +rem 2: JAVA_OPTS 可通过 -D 传入 undertow.port 与 undertow.host 这类参数覆盖 +rem 配置文件中的相同值此外还有 undertow.resourcePath, undertow.ioThreads +rem undertow.workerThreads 共五个参数可通过 -D 进行传入 +rem +rem 3: JAVA_OPTS 可传入标准的 java 命令行参数,例如 -Xms256m -Xmx1024m 这类常用参数 +rem +rem +rem ------------------------------------------------------------------------- + +setlocal & pushd + + +rem 启动入口类,该脚本文件用于别的项目时要改这里 +set MAIN_CLASS=com.cowr.service.ssjygl.main.Main + +rem 项目中有 undertow.txt 配置文件的,可从配置文件中读取 undertow 的启动参数,可以不用 JAVA_OPTS +rem Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格 +rem set "JAVA_OPTS=-Xms256m -Xmx1024m -Dundertow.port=9080 -Dundertow.host=0.0.0.0" +rem set "JAVA_OPTS=-Dundertow.port=9080 -Dundertow.host=0.0.0.0" + +set APP_BASE_PATH=%~dp0 +set CP=%APP_BASE_PATH%config;%APP_BASE_PATH%lib\* +java -Xverify:none %JAVA_OPTS% -cp %CP% %MAIN_CLASS% + + +endlocal & popd +pause + + + diff --git a/ssjygl-xsx-service/start.sh b/ssjygl-xsx-service/start.sh new file mode 100644 index 0000000..62bfba7 --- /dev/null +++ b/ssjygl-xsx-service/start.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# --------------------------------------------------------------------------- +# +# 使用说明: +# +# 1: 该脚本用于别的项目时只需要修改 MAIN_CLASS 即可运行 +# +# 2: JAVA_OPTS 可通过 -D 传入 undertow.port 与 undertow.host 这类参数覆盖 +# 配置文件中的相同值此外还有 undertow.resourcePath、undertow.ioThreads、 +# undertow.workerThreads 共五个参数可通过 -D 进行传入,该功能尽可能减少了 +# 修改 undertow 配置文件的必要性 +# +# 3: JAVA_OPTS 可传入标准的 java 命令行参数,例如 -Xms256m -Xmx1024m 这类常用参数 +# +# 4: 脚本最后一部分给出了 4 种启动项目的命令行,根据注释中的提示自行选择合适的方式 +# +# --------------------------------------------------------------------------- + +# 启动入口类,该脚本文件用于别的项目时要改这里 +MAIN_CLASS=com.cowr.service.ssjygl.main.Main + +# 项目中有 undertow.txt 配置文件的,可从配置文件中读取 undertow 的启动参数,可以不用 JAVA_OPTS +# Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格 +# JAVA_OPTS="-Xms256m -Xmx1024m -Dundertow.port=9080 -Dundertow.host=0.0.0.0" +# JAVA_OPTS="-Dundertow.port=9081 -Dundertow.host=0.0.0.0" + +# 生成 class path 值 +APP_BASE_PATH=$(cd `dirname $0`; pwd) +CP=${APP_BASE_PATH}/config:${APP_BASE_PATH}/lib/* + +# TODO debug 时可以将所有控制台日志输出到 output.log 会很大 +# 运行为后台进程,并在控制台输出信息 +# java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} > output.log + +# 运行为后台进程,并且不在控制台输出信息 +# nohup java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} >/dev/null 2>&1 & + +# 运行为后台进程,并且将信息输出到 output.log 文件 +# nohup java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} > output.log & + +# 运行为非后台进程,多用于开发阶段,快捷键 ctrl + c 可停止服务 +/home/admin123456/hsjygl_hzq/jdk1.8.0_251/bin/java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} +#java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} + + + + + + +