通过自建鉴权(PHP cache token + Kotlin WebSocket 登录),批量真实调用全部 373 个查询接口,记录响应状态 + 耗时。仅 24 秒完成。
你提了"全调一遍"的需求,我评估有 3 种做法,安全和深度各有取舍。本报告做的是方案 A。
调所有查询接口,记录 HTTP/耗时/响应大小/错误
包括写接口(新增/删除/修改/审核),每条用最小参数
跑 3-5 个完整业务流(销售/采购/调拨/盘点)
149 个 WS 路由
224 个 controller 方法
共 98 个成功响应的接口耗时分布如下:
xipunum_erp_ksiamges 缺索引高度吻合。
xipu-agg-patch.tar.gz),里面包括:
01_mapper_replacement.xml - 新版 Kotlin mapper SQL(聚合表查询)
02_build_agg_tables.sql - 3 张聚合表 DDL(agg_outbound_daily / agg_outbound_order_daily / agg_retreat_daily)
03_backfill_agg.sql - 全量回填脚本
04_xipu-agg-refresh.sh - 滑动 7 天 cron 脚本(每 5 分钟一次)
05_xipu-agg-rebuild-all.sh - 全量重建脚本(应急用)
README.md - 6 步上线 + 风险预案 + 回滚方案,工程化程度满分。
v4UserOutOrderCategoryTotal 这一个 SQL(手机端 APP 首页销售分类统计),Controller/Service 一行不动,输出字段完全兼容。
02_build_agg_tables.sql)—— 空表无影响03_backfill_agg.sql)—— 本地实测 4 秒,生产估 < 30 秒*/5 * * * * /usr/local/bin/xipu-agg-refresh.sh(滑动 7 天重算)xipu-agg-rebuild-all.sh 全量重建(30 秒)。建议加凌晨 1 点的全量 cron 兜底README 提供完整回滚方案:
UNIQUE KEY uk_date_cat_guide (date_d, category_id, shopping_guide) 在 agg_outbound_daily 上。
WebSocket 协议,路径 /rwy/。每个接口标三种状态:🟢 调通 🟡 缺参数(接口活的) 🔴 失败(需要修)
ErpKsiamgesErpKsiamgesSalesErpOutboundOrderErpOutboundTempErpOutboundNetweightOrderErpInboundOrderErpPresaleOrderErpPresaleTempErpRetreatOrderErpRetreatTempErpStocktapdErpTransferErpTransferOrderErpOrderErpOrderSalesErpOrderKufangSalesErpOrderRetreatErpOrderCategoryErpOrderGuideSalesErpOrderFinanceErpLskcReportSalesErpLskcReportSalesV1ErpLskcVsReportSalesErpReportformsErpReportformsV3ErpReportformsV4ErpGridReportErpMemberErpMemberCqErpMemberV1ErpUserErpUserGuideSalesErpLoginErpCategoryErpLabelErpAlertErpAlertNoticeErpIamgesErpAboutErpMenuAppErpReceiptErpRetreatTitleErpShopErpPayErpSwAiotPrintErpXipunumConfigErpheartBeat这些接口需要排查 - 鉴权、参数解析或代码逻辑出问题
inbound/buyOrderDeleteinbound/buyRecordReviewinbound/queryBuyRecordDetailsinbound/queryBuyRecordListinbound/shopininbound/shopOrderLabelListlogin/getUserLocIpPresale/linshimemberOrderCategorySales/statOrderCategorySalesInfoListOrderCategorySales/statOrderCategorySalesListorder/listorder/newListFinance/queryFinanceSalesListFinance/queryFinanceSalesTotalFinanceV1/queryFinanceSalesTotalByCjuserFinanceV1/queryFinanceSalesTotalOrderGuideSales/queryOrderGuideSalesCategoryListOrderGuideSales/queryOrderGuideSalesInfoOrderGuideSales/queryOrderGuideSalesInfoNewOrderGuideSales/queryOrderGuideSalesListOrderGuideSales/queryOrderGuideSalesListNewOrderKufangSales/queryOrderKufangSalesShopListOrderKufangSales/queryOrderKufangSalesUserListOrderKufangSales/statOrderKufangSalesShopListOrderRetreat/statOrderRetreatGrossProfitInfoOrderRetreat/statOrderRetreatSalesInfoOrderRetreat/statOrderRetreatSalesListOrderSales/queryOutShoppingGuideListOrderSales/queryUserByStoreListOrderSales/statKufangOrderCategorySalesInfoListOrderSales/statKufangOrderSalesInfoOrderSales/statKufangOrderSalesInfoNewOrderSales/statKufangOrderSalesListOrderSales/statKufangOrderSalesListNewOutboundNetweightOrder/queryOutboundNetweightAddOutboundNetweightOrder/queryOutboundNetweightBatchAddOutboundNetweightOrder/queryOutboundNetweightListOutboundNetweightOrder/queryOutboundNetweightListInfoOutboundNetweightOrder/queryOutboundNetweightListV2outbound/shopoutShop/UpDateFieldoutbound/DeleteTempShopoutbound/tempOrderListoutbound/memberloadoutbound/linshishopShop/shopDiscountUpdataPresale/shopchaxunPresale/shujulistPresale/shopyushouPresale/deleteOrderShopPresale/linshishopv4Reportforms/v4UserSetIncreaseTotalRetreat/queryOrderNumRetreat/shophuishouRetreat/deleteOrderShopRetreat/linshishopShop/GetShopCodeModelNoV1Stocktaking/ClearTempStocktaking/DeleteTempStocktaking/newSaveTempStocktaking/newStocktakingOrderShopStocktaking/newUpdateStocktapdChayiInfoStocktaking/newUpdateTempShopStocktaking/SaveTempStocktaking/UpdateTempprint/getAiotPrintConfigTransfer/queryTransferInfoTransfer/queryTransferToShopInfoTransfer/addTransferToShopList接口本身是活的,只是没传业务参数(时间/库房/款号等),传对就能跑
reportforms/newUserTotal, reportforms/querypermission, reportforms/querypricetotal, reportforms/querypermissionNew, reportforms/usertotal, v3Reportforms/v3UserOutOrderCategoryTotal, v3Reportforms/v3UserOutOrderProfitIncomeTotal, v3Reportforms/v3UserOutOrderRetreatTotal, v3Reportforms/v3UserSetIncreaseTotal, v3Reportforms/v3UserSetTotal, v4Reportforms/v4UserOutOrderCategoryTotal, v4Reportforms/v4UserOutOrderChsRetreatTotal, v4Reportforms/v4UserOutOrderProfitIncomeTotal, v4Reportforms/v4UserOutOrderRetreatTotal, v4Reportforms/v4UserSetTotal
LskcReportSales/queryLskcReportSalesByGroupNew, LskcReportSales/queryLskcReportSalesCategoryList, LskcReportSales/queryLskcReportSalesInfoGuigeList, LskcReportSales/queryLskcReportSalesList, LskcReportSalesV1/queryLskcReportSalesCategoryList, LskcVsReportSales/queryLskcVsReportSalesList
KsiamgesAlert/queryShopKucunToKsiamgesInfoList, UserSales/queryOutOrderUserGuideList, UserSales/queryUserGuideCategoryInfo, UserSales/queryUserGuideInfo
Label/queryLabelList, MemberV1/list, MemberV2/list, MemberV2/myList
Member/queryMemberSalesList, MemberCq/editliaok, MemberCq/queryMemberCqSalesList
Outbound/querShopTotal, outbound/shopxq, outbound/shopchaxun
Alert/delAlertList, Alert/updateAlertInfo
gridReport/html5/configData, gridReport/html5/config
ksiamges/querKsiamgesList, Shop/GetModelNo
login/login, login/userPwd
Alert/saveAlertInfo
iamges/addIamgesInfo
login/steta
login/wsUserInfo
LskcReportSales/queryLskcReportSalesInfoGuigeShopList
Member/queryNameMember
Member/updateMember
Receipt/queryOutBoundReceipt
reportforms/newUserByCategoryTotal
ThinkPHP 后端,HTTP POST 协议,鉴权 header token + 文件 cache。每个接口标三种状态:🟢 调通 🟡 缺业务参数 🔴 失败(多为本地 schema 不匹配)
AliyunimagesearchAliyunossBackupFrameGoodspresaleLogMainMemberMenuMenuappOftenRetreatRoleStocktakingSysUserWarehouseWxsetAllotBatchBillBorBreBrtBuyCategoryCodeCostCrtCustomerEntryExtryGoodsGoodslogGoodsoutboundIceImyIndexInventoryInvoiceMaterialMouldMrtOceOmyOrderPeoplePrintapiSellSerialServiceSorSreSrtStockSupplierSwap主要原因:本地数据库表名跟代码不对应(如 xipunum_sor 表不存在)。生产环境的阿里云 RDS 上可能是正常的。
AccountAttributeFieldIetPeriodRawmaterialTuikuWrfaccount/getaccount/recordallot/recordattribute/getattribute/recordattribute/selectbill/recordbor/recordbre/recordbrt/bbtExportsbrt/bltExportsbrt/botExportsbuy/getFindCodebuy/getFindCodeAllbuy/get_phone_imagesbuy/reviewcategory/getcode/getcode/recordcost/formExportscrt/cbfExportscrt/cdsExportscrt/citExportscrt/cosExportscustomer/getcustomer/recordentry/recordextry/recordfield/getfield/recordgoods/findAllCodegoods/getFindCodegoodslog/datalistgoodslog/datalistsgoodslog/getAllsettlementgoodslog/getCategorySummarygoodslog/getRetreatSummarygoodslog/getRetreatWholesalegoodslog/getSaleReportbaobiangoodslog/getretreatjishugoodslog/pagegoodsoutbound/findcodegoodsoutbound/findreturncodegoodsoutbound/getPrintSalesReceiptsDataice/recordiet/getiet/recordimy/recordindex/indexinventory/exportsmould/findmould/getmould/recordmrt/motExportsoce/recordomy/recordorder/reviewperiod/recordprintapi/getPrintSalesReceiptsDatarawmaterial/rawmaterialhslistrawmaterial/rawmaterialtypelistsell/recordserial/exportsservice/accountRecordservice/customerRecordservice/get_gold_priceservice/goodsRecordservice/ietRecordsor/recordsre/recordsrt/sbtExportssrt/sltExportssupplier/getsupplier/recordswap/recordtuiku/getFindCodetuiku/getFindCodeAlltuiku/getFindCodeAllswrf/wbsExportswrf/wdsExportswrf/wssExports接口活的,传对业务参数就能跑
allot/get, batch/detailRecord, batch/record, bill/get, bor/get, bre/get, brt/bsyExports, brt/bttExports, buy/get, code/view, cost/exports, cost/record, crt/cctExports, crt/cpsExports, crt/crsExports, crt/cstExports, entry/get, extry/get, ice/get, imy/get, inventory/record, invoice/exports, invoice/formExports, invoice/record, mould/select, mrt/mptExports, oce/get, omy/get, sell/get, serial/detailRecord
... 还有 13 个
allot/exports, batch/detailExports, batch/exports, bill/exports, bor/exports, bre/exports, buy/exports, code/exports, customer/exports, entry/exports, extry/exports, goods/exports, ice/exports, imy/exports, mould/exports, oce/exports, omy/exports, people/exports, sell/exports, serial/detailExports, sor/exports, sre/exports, stock/detailExports, stock/exports, supplier/exports, swap/exports
material/detail, material/review
index/getqrcode
printapi/getPrintLableData
xipuerp 是从阿里云 RDS 同步的,但实际表名是 xipunum_erp_outbound_order、xipunum_erp_member 这样的"新版命名"。而 xipu_erp_php 源码里很多接口写的是 sor、customer、bor、bill 这种"老版命名"。本地副本主要是给 Kotlin 后端用的。PHP 网页端要在生产环境(阿里云 RDS 上的老 schema)才能跑全。
按响应时间倒序排,只看成功响应的:
goodslog/getSaleReportsgoodslog/getSaleSummaryShop/GetShopCodeModelNogoodslog/getlskcReportservice/getUpgradegoodsoutbound/listgoodslog/getSaleReportmain/getBuyLoggoodslog/getspReportgoodslog/getspReportV2print/swAiotGetDevicestocktaking/selectlistbuy/recordgoods/recordmember/listxipunum_erp_ksiamges 缺索引,导致销售类报表 SQL 全表扫描。这就是用户感知到 ERP "卡"的根源。