# 2026-07-17 工作记录 ## 日期修正 SQL — 新增第16、17表(ecid='hsjm') 继7月15日已生成的15个表批量日期修正脚本之后,今日补充两个表: ### 16. 收款单 `dmp_serp.idb_fin_ar_collection_doc` ```sql UPDATE dmp_serp.idb_fin_ar_collection_doc SET doc_date = doc_date, create_time = STR_TO_DATE( CONCAT(DATE_FORMAT(doc_date, '%Y-%m-%d'), ' ', DATE_FORMAT(create_time, '%H:%i:%s')), '%Y-%m-%d %H:%i:%s' ) WHERE ecid = 'hsjm'; ``` ### 17. 付款单 `dmp_serp.idb_fin_ap_payment_doc` ```sql UPDATE dmp_serp.idb_fin_ap_payment_doc SET doc_date = doc_date, create_time = STR_TO_DATE( CONCAT(DATE_FORMAT(doc_date, '%Y-%m-%d'), ' ', DATE_FORMAT(create_time, '%H:%i:%s')), '%Y-%m-%d %H:%i:%s' ) WHERE ecid = 'hsjm'; ``` ### 规则说明 - 与之前15个表一致:用业务日期源字段(`doc_date`)的日期部分替换 `create_time` 的日期,保留原时分秒 - 不更新 `update_time` - 数据库 `dmp_serp` 不在本地 Docker MySQL 实例中,需在对应环境的数据库上执行 ## JumpServer 堡垒机 API 认证测试 **时间:** 2026-07-17 14:17 **API 凭证:** - Access Key: `ae50b72c-e92e-4185-8371-636bc16bdde0` - Secret Key: `e0414b64-4126-4747-b318-8457dcd8590d` - 堡垒机地址:`https://bastion.witdn.com` **测试结果:** - 堡垒机 Web 页面可正常访问(HTTP 200) - API 认证尝试多次,签名格式始终不对(返回 "Invalid signature") - JumpServer 的 Signature 认证需要 HMAC-SHA1 签名,签名串格式为:`{method}\n{accept}\n{date}\n{path}\n` - 需要进一步调试签名算法或确认 API 凭证权限 **后续:** 可能需要用正确的 Python 脚本生成签名,或确认凭证是否有 API 访问权限。 ## MySQL 数据库连接与表操作 ### 本地 Docker MySQL(dmp_serp) - **容器名**: mysql (mysql:8) - **密码**: `MYSQL_PWD_SQL=5gynj20J`(来自 .env) - **命令模板**: `docker exec mysql mysql -u root -p"${MYSQL_PWD_SQL}" -D dmp_serp` ### 远程服务器 - **IP**: `101.34.227.188` (xuan-vps) - **版本**: MySQL 8.4.9 - **用户**: root / 5gynj20J - **可用库**: `dmp_smdm`(物料主数据)、`ruoyi-vue-pro`、`sys` - **注意**: 远程无 `dmp_serp` 库 ### 新建表 - **`dmp_im_stock_out`**(出库表)— 在本地 `dmp_serp` 创建,54个字段,InnoDB/utf8mb4 ### 级联更新 SQL(ecid='hsjm') 基于 `dmp_im_stock_in_out_flow_detail` 的 `stock_date` 更新入库单和出库单: ```sql -- 1. 更新流水明细(每个 stock_no 取 MIN(stock_date)) UPDATE dmp_serp.dmp_im_stock_in_out_flow_detail t1 INNER JOIN ( SELECT ecid, stock_no, MIN(stock_date) AS min_stock_date FROM dmp_serp.dmp_im_stock_in_out_flow_detail WHERE ecid = 'hsjm' AND stock_date IS NOT NULL GROUP BY ecid, stock_no ) t2 ON t1.ecid = t2.ecid AND t1.stock_no = t2.stock_no AND t1.stock_date = t2.min_stock_date SET t1.create_time = STR_TO_DATE(CONCAT(DATE_FORMAT(t1.stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(t1.create_time,'%H:%i:%s')),'%Y-%m-%d %H:%i:%s'), t1.update_time = STR_TO_DATE(CONCAT(DATE_FORMAT(t1.stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(t1.update_time,'%H:%i:%s')),'%Y-%m-%d %H:%i:%s') WHERE t1.ecid = 'hsjm'; -- 2. 级联更新入库单(stock_in_no = stock_no) UPDATE dmp_serp.dmp_im_stock_in t1 INNER JOIN ( SELECT ecid, stock_no, MIN(stock_date) AS min_stock_date FROM dmp_serp.dmp_im_stock_in_out_flow_detail WHERE ecid = 'hsjm' AND stock_date IS NOT NULL GROUP BY ecid, stock_no ) t2 ON t1.ecid = t2.ecid AND t1.stock_in_no = t2.stock_no SET t1.create_time = STR_TO_DATE(CONCAT(DATE_FORMAT(t2.min_stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(t1.create_time,'%H:%i:%s')),'%Y-%m-%d %H:%i:%s'), t1.update_time = STR_TO_DATE(CONCAT(DATE_FORMAT(t2.min_stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(t1.update_time,'%H:%i:%s')),'%Y-%m-%d %H:%i:%s'), t1.completed_at = STR_TO_DATE(CONCAT(DATE_FORMAT(t2.min_stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(COALESCE(t1.completed_at,t1.create_time),'%H:%i:%s')),'%Y-%m-%d %H:%i:%s'), t1.bill_date = t2.min_stock_date WHERE t1.ecid = 'hsjm'; -- 3. 级联更新出库单(stock_out_no = stock_no) UPDATE dmp_serp.dmp_im_stock_out t1 INNER JOIN ( SELECT ecid, stock_no, MIN(stock_date) AS min_stock_date FROM dmp_serp.dmp_im_stock_in_out_flow_detail WHERE ecid = 'hsjm' AND stock_date IS NOT NULL GROUP BY ecid, stock_no ) t2 ON t1.ecid = t2.ecid AND t1.stock_out_no = t2.stock_no SET t1.create_time = STR_TO_DATE(CONCAT(DATE_FORMAT(t2.min_stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(t1.create_time,'%H:%i:%s')),'%Y-%m-%d %H:%i:%s'), t1.update_time = STR_TO_DATE(CONCAT(DATE_FORMAT(t2.min_stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(t1.update_time,'%H:%i:%s')),'%Y-%m-%d %H:%i:%s'), t1.delivery_at = STR_TO_DATE(CONCAT(DATE_FORMAT(t2.min_stock_date,'%Y-%m-%d'),' ',DATE_FORMAT(COALESCE(t1.delivery_at,t1.create_time),'%H:%i:%s')),'%Y-%m-%d %H:%i:%s'), t1.bill_date = t2.min_stock_date WHERE t1.ecid = 'hsjm'; ``` ### 当前状态 三个表(`dmp_im_stock_in`、`dmp_im_stock_out`、`dmp_im_stock_in_out_flow_detail`)在 `dmp_serp` 中均**无数据**(ecid='hsjm'),需先导入数据后再执行更新。 ## 工作空间初始化 重写所有配置文件为中文: - **IDENTITY.md** — SQL Agent,职责:连接数据库、编写分析SQL、提供脚本 - **SOUL.md** — 直接有用、有判断力、先查再做 - **AGENTS.md** — 会话启动、记忆管理、红线、数据库操作规范 - **USER.md** — yangxuan、Asia/Shanghai、偏好中文/简洁/本地客户端 - **HEARTBEAT.md** — 删除(SQL Agent 不需要心跳任务) - **.git** — 删除独立仓库,使用 `.openclaw` 公用 git - **.env** — 删除重复文件,共用 `/home/yangxuan/.openclaw/.env` ## 技能安装 从 ClawHub 安装 **sql-toolkit@1.0.0**,覆盖查询设计、迁移优化、索引策略等最佳实践。 ## 新建表 - **`dmp_om_productinfo`**(订单明细表)— 在本地 `dmp_serp` 创建,87个字段,InnoDB/utf8mb4,3个复合索引 ## 跨库级联更新 ### qc_task_inspect ← dmp_mc_purchase_arrival 关联条件:`arrival_doc_no = arrival_no` ```sql UPDATE dmp_smes.qc_task_inspect t1 INNER JOIN dmp_serp.dmp_mc_purchase_arrival t2 ON t1.arrival_doc_no = t2.arrival_no SET t1.insp_time = STR_TO_DATE( CONCAT(DATE_FORMAT(t2.ship_date, '%Y-%m-%d'), ' ', DATE_FORMAT(t1.insp_time, '%H:%i:%s')), '%Y-%m-%d %H:%i:%s' ), t1.create_time = STR_TO_DATE( CONCAT(DATE_FORMAT(t2.ship_date, '%Y-%m-%d'), ' ', DATE_FORMAT(t1.create_time, '%H:%i:%s')), '%Y-%m-%d %H:%i:%s' ), t1.update_time = STR_TO_DATE( CONCAT(DATE_FORMAT(t2.ship_date, '%Y-%m-%d'), ' ', DATE_FORMAT(t1.update_time, '%H:%i:%s')), '%Y-%m-%d %H:%i:%s' ) WHERE t2.ship_date IS NOT NULL; ``` ### dmp_me_work_operate_record_detail 根据报工日期 `report_date` 更新创建时间和更新时间: ```sql UPDATE `dmp_me_work_operate_record_detail` t1 SET t1.create_time = STR_TO_DATE( CONCAT(DATE_FORMAT(t1.report_date, '%Y-%m-%d'), ' ', DATE_FORMAT(t1.create_time, '%H:%i:%s')), '%Y-%m-%d %H:%i:%s' ), t1.update_time = STR_TO_DATE( CONCAT(DATE_FORMAT(t1.report_date, '%Y-%m-%d'), ' ', DATE_FORMAT(t1.update_time, '%H:%i:%s')), '%Y-%m-%d %H:%i:%s' ) WHERE t1.ecid = 'kangda' AND t1.report_date IS NOT NULL; ``` ## 数据导入经验 - INSERT 语句中的 `-- NULL` 注释会被 MySQL 当作行内注释吞掉后续值,导致列数不匹配 - 非必填字段可以跳过不插,只写有值的字段 - 长 INSERT 建议写入 `.sql` 文件后通过 `< file.sql` 导入