站长信息
jeffery.xu
jeffery.xu

软件工程师

欢迎访问我的个人笔记网站!我是一名热爱技术的开发者,专注于Web开发和技术分享。

811495111@qq.com
18521510875
筛选

个人笔记

一键脚本发布
编程技巧

.\scripts\deploy.ps1 -ServerHost "106.54.42.242" -ServerUser "ubuntu" -ServerComposePath "/home/ubuntu"

清空vscode记录
编程技巧

Write-Host "正在清理 VSCode 相关文件..." -ForegroundColor Yellow # 停止可能运行的 VSCode 进程 Get-Process "Code" -ErrorAction SilentlyContinue | Stop-Process -Force # 删除文件夹 $paths = @( "$env:APPDATA\Code", "$env:APPDATA\Code - Insiders", "$env:LOCALAPPDATA\Programs\Microsoft VS Code", "$env:LOCALAPPDATA\Programs\VS Code", "$HOME\.vscode" ) foreach ($path in $paths) { if (Test-Path $path) { Remove-Item -Recurse -Force $path Write-Host "已删除: $path" -ForegroundColor Green } } Write-Host "清理完成!" -ForegroundColor Green

UVX报错
编程技巧

在用 uvx 配置 MCP server 时,安装 amap-mcp-server==0.1.11 失败,报错是
The system cannot open the device or file specified (os error -2147024786),随后触发 MCP error -32000: Connection closed。


uvx 的独立安装/缓存链路在 Windows 上出问题。
机器里同时有两份 uv(pip 版 + standalone 版),导致 uv self update 初始失败。
解决方案总结:
1. 先解决 uv 冲突:卸载 pip 版或确保命中 standalone 版。

卸载 pip 版 uv

python -m pip uninstall -y uv

新开一个 PowerShell,确认命中的是 standalone

where uv
uv --version
uv self update
success: Upgraded uv from v0.10.10 to v0.10.12! https://github.com/astral-sh/uv/releases/tag/0.10.12
把 uv 升级到 0.10.12,说明这一步已完成。
若 uvx 仍报设备/文件错误,设置:
• UV_CACHE_DIR=C:\uv-cache
• UV_LINK_MODE=copy
然后重开终端再试。
高德地图MCP
编程技巧
"高德地图": {
      "url": "https://mcp.amap.com/sse?key="
    }
本地 `git push` 失败(GitHub 单文件上限 100MB)。
编程技巧

问题总结(可直接记录):

1. 现象  
本地 `git push` 失败,原因是提交历史里包含了 `DiaryWebsite.Web/logs/` 下超过 100MB 的 `.log` 文件(GitHub 单文件上限 100MB)。

2. 约束  
你已经有很多其他改动并且都 commit 了,不能简单回退提交。

3. 处理思路  
不回退业务改动,只把大日志文件从 Git 历史中移除,并防止未来再次被提交。

4. 关键操作  
- 在 `.gitignore` 中忽略日志文件(如 `DiaryWebsite.Web/logs/*.log`)。  
- 用历史清理工具(`git filter-repo`)删除历史中的日志文件记录。  
- 清理后发现远程 `origin` 丢失(报错:`'origin' does not appear to be a git repository`)。  
- 重新添加远程:`https://github.com/jy02542317/Diary.git`。  
- `git fetch origin --prune` 后,再执行  
  `git push -u origin main --force-with-lease` 成功。

5. 最终结果  
远程 `main` 已成功更新(forced update),仓库恢复可正常 push/pull。

6. 经验与预防  
- 日志、打包产物、大模型文件不要直接进 Git。  
- 通过 `.gitignore` 提前屏蔽 `logs/*.log`。  
- 大文件如需版本管理,使用 Git LFS。  
- 一旦做了历史重写并 force push,需通知协作者同步分支。

```bash
# 1) 先备份一个分支(防止误操作)
git branch backup-before-clean-large-file

# 2) 忽略日志文件
echo DiaryWebsite.Web/logs/*.log >> .gitignore
git add .gitignore
git commit -m "chore: ignore log files"

# 3) 安装历史清理工具(若未安装)
pip install git-filter-repo

# 4) 从历史中移除 logs 下的 .log 文件
git filter-repo --force --path-glob "DiaryWebsite.Web/logs/*.log" --invert-paths

# 5) 重新添加远程(filter-repo 后可能丢失)
git remote add origin https://github.com/jy02542317/Diary.git

# 6) 检查远程是否配置成功
git remote -v
git remote get-url origin

# 7) 拉取远端引用,避免 force-with-lease 的 stale info
git fetch origin --prune

# 8) 强制推送清理后的 main(保留 lease 保护)
git push -u origin main --force-with-lease
```

你这次实际成功推送时的关键输出是:
- `branch 'main' set up to track 'origin/main'.`
- `main -> main (forced update)`

K6压测工具
编程技巧

**完整安装过程总结(含踩坑与解决)**

1. 目标  
在 Windows 上全局安装 `k6`,并能在任意目录执行 `k6` 命令。

2. 初始问题  
你一开始执行:
```powershell
winget install k6 --source winget
```
报错:`winget` 无法识别。  
原因:系统虽有“应用安装程序(App Installer)”,但 `winget` 命令入口未生效(PATH/别名/注册问题)。

3. 修复 `winget` 的过程  
你做了这些关键操作:

```powershell
$pkg = Get-AppxPackage Microsoft.DesktopAppInstaller
Add-AppxPackage -DisableDevelopmentMode -Register "$($pkg.InstallLocation)\AppXManifest.xml"
```

中途遇到错误 `0x80073D02`(资源被占用),通过关闭占用程序后重试解决。  
之后又发现:
```powershell
$env:Path -split ';' | Select-String "WindowsApps"
```
为空,说明 `WindowsApps` 不在 PATH。补 PATH 后,`winget --info` 成功,说明 `winget` 已恢复可用。

4. 安装 `k6` 时的问题  
你先用:
```powershell
winget install -e --id k6.k6 --source winget
```
失败“找不到包”。  
原因:包 ID 写错。正确 ID 来自搜索结果:
```powershell
winget search k6 --source winget
```
显示正确 ID 是 `GrafanaLabs.k6`。

5. 正确安装命令  
最终成功安装:
```powershell
winget install -e --id GrafanaLabs.k6 --source winget
```
安装日志显示已下载并安装 MSI 成功。

6. 安装后 `k6` 仍不可识别  
你执行 `k6 version` 仍报找不到命令。  
原因:新安装路径未在当前终端会话生效(常见 PATH 刷新问题)。  
解决方式:
1. 关闭并重新打开 PowerShell 再试。  
2. 若仍不行,定位 `k6.exe` 路径并加入 PATH(通常是 `C:\Program Files\k6`)。

7. 最终结论  
你已经完成了核心安装,当前只差终端会话/PATH 生效这一步。  
最终应达到:
```powershell
k6 version
```
可正常输出版本号,即全局安装成功。

---

**这次最关键的经验**
1. `winget search` 里 `ID` 列才是可安装的精确包名。  
2. “安装成功但命令不可用”通常是 PATH 未刷新,不一定是安装失败。  
3. `App Installer` 显示已安装,不代表 `winget` 一定立即可用,可能还需注册/别名/PATH 修复。

弹框查询慢优化
工作笔记

一、当前已改的代码
1. 去掉了 Page_Load 的重复绑定
文件:DMS\OrderInfoMnangerment\OrderInfo\UT_ProductListSelect.aspx.cs
你现在的 InitializeComponent() 里已经把这句注释掉了:
•    this.Load += new System.EventHandler(this.Page_Load);
作用:
•    避免首次打开弹窗时 Page_Load 被重复触发
•    避免 !IsPostBack 里的 ucCustomPaging.LoadData(...) 被多执行一次
---
2. 去掉了 btnQuery 的重复绑定
文件:DMS\OrderInfoMnangerment\OrderInfo\UT_ProductListSelect.aspx.cs
AppendServerEvents() 里原来有两次:
•    this.btnQuery.ButtonClick += ...
现在保留了一次,另一处已注释。
作用:
•    点击“查询”按钮时,避免 btnQuery_ButtonClick() 触发两次
•    避免 GetMyProductInfoList() 被重复调用
---
3. 优化了 GetFilter() 的 SQL 条件拼接
文件:DMS\OrderInfoMnangerment\OrderInfo\UT_ProductListSelect.aspx.cs
这部分是本次真正落地的主要 SQL 优化。
3.1 SSO_SameLotInfo
从:
•    FK_SSO_ProductCategoryID in (...)
改成:
•    exists(select 1 ...)
作用:
•    减少大表 in 子查询带来的额外代价
3.2 UT_OrderDetailInfo
从:
•    ut_product.pkid not in (...)
改成:
•    not exists(select 1 ...)
作用:
•    避免 not in 的执行问题和 NULL 风险
•    更利于索引使用
3.3 SOI_ProductStockAdjust
从:
•    对 StartTime / EndTime 做 CONVERT(...)
改成:
•    StartTime < tomorrowStart
•    EndTime >= todayStart
并且整体改成:
•    not exists(...)
作用:
•    去掉对列的函数转换
•    提升日期范围条件走索引的概率
3.4 FCN_Product
从:
•    CONVERT(nvarchar(10), BuyStartTime, 120) > ...
改成:
•    BuyStartTime >= tomorrowStart
作用:
•    日期字段可走索引
3.5 OPF_ProductSettingRecord + AllowOrderChoose
从:
•    月份比较 CONVERT(nvarchar(7), ...)
•    日期比较 CONVERT(varchar(100), ...)
改成:
•    BeginDate < nextMonthStart
•    EndDate >= monthStart
•    AllowOrderChoose 也改成日期范围比较
作用:
•    去掉月份/日期字符串转换
•    更适合索引
3.6 SOI_ShipToProductPurchase
从:
•    先调用 getShiptoIDCount() 额外查一次
•    再决定是否拼 in (...)
改成:
•    直接一条相关条件:
•    not exists(...) or exists(...)
作用:
•    少一次额外预查询
•    逻辑合并到主 SQL 中
---
二、你当前代码里“虽然没改,但已确认的问题”
1. 弹窗初次打开时多次查询的原因
已确认来源有两个:
•    Page_Load 重复绑定
•    btnQuery 重复绑定
你现在这两个点都已经处理掉了。
2. ucCustomPaging.LoadData(this.GetLastPageNumber(...))
这个仍然保留。
它可能导致:
•    首次打开恢复到旧页码
•    如果旧页码大于总页数,分页控件内部可能再补查一次
这个点还没改。
---
三、已给出但还没正式落地到代码的改动
1. BusinessRule.UT_OrderInfo.GetMyProductInfoList()
文件:..\BusinessRule\OrderInfo\UT_OrderInfo.cs
建议方案已给出,但你还没正式应用到代码里。
核心思路是:
•    删除 subfilter 里重复加的 UT_DealerNetPrice 相关条件
•    把 UT_DealerNetPrice 从“where 过滤”改成“带条件的 inner join”
•    删掉无用的 DOH_ProductLimit join
目的:
•    避免价格表重复过滤
•    尽早缩小结果集
•    让执行计划更清晰
---
四、数据库侧已给出的优化建议
1. 已给出索引创建 SQL
已给出这些表的索引脚本:
•    UT_DealerNetPrice
•    SOI_SDDealerDetails
•    SSO_SameLotInfo
•    UT_OrderDetailInfo
•    SOI_ProductStockAdjust
•    SOI_ProductStockAdjustDetail
•    FCN_Product
•    OPF_ProductSettingRecord
•    AllowOrderChoose
•    SOI_ShipToProductPurchase
•    UT_Product
2. 已给出索引删除 SQL
用于回滚测试。
---
五、目前结论
这次优化的结果可以概括成:
已落地
•    去掉重复事件绑定
•    优化 GetFilter() 里的 in/not in
•    去掉日期字段上的 CONVERT
•    减少一次额外 ShipTo 预查询
未落地但已准备好
•    GetMyProductInfoList() 的 join 改造
•    数据库索引落库执行

Docker Compose 发布完整流程
人工智能学习

1. 本地构建并打包镜像

cd c:\Users\jeffery\Documents\GitHub\Diary

# 构建镜像
docker build -t diary-website:latest .

# 打包
docker save diary-website:latest -o diary-website.tar

2. 上传到服务器

scp diary-website.tar ubuntu@106.54.42.242:/home/ubuntu/

scp docker-compose.yml ubuntu@106.54.42.242:/home/ubuntu/

3. 服务器加载并启动

# 加载镜像
docker load -i diary-website.tar

sudo docker stop diary-website
sudo docker rm diary-website

# 启动容器 docker-compose up -d # 查看状态 docker-compose ps
 
VPN
人工智能学习

https://conyss.uk

Order form 在系统中的情况
工作笔记

1) CC4 修改 order form 的核心逻辑
入口在 ServicesBll.cs 的 case "DMS_RProductFamily":
•    SpecialParameter == "CC4IsInApproval":先校验该 CC4 是否在审批流中(CT_CC4IsInApproval)。
•    SpecialParameter == "UpdateProductSalesteam" 且 EDITE:进入
ServicesBll.DMS_Product.cs -> UpdateProductSalesteam(...)。
UpdateProductSalesteam(...) 会把前端传入的 a_OrderFormName_id 写入参数 OrderFormName_Id,然后执行两段 SQL:
1.    CT_UpdateProductSalesteamEdite
批量更新该 CC4 下所有产品:
•    DMS_Product.FK_EDMS_OrderForm_ID = @OrderFormName_Id
2.    CT_UpdateDMS_RProductFamily(编辑)或 CT_ADDDMS_RProductFamily(新增)
更新/新增 CC4 主档:
•    DMS_RProductFamily.FK_EDMS_OrderForm_ID = @OrderFormName_Id
---
2) CC4 改 order form 后会更新哪些表
直接更新:
•    DMS_Product(批量更新该 CC4 下产品的 FK_EDMS_OrderForm_ID)
•    DMS_RProductFamily(更新该 CC4 自身的 FK_EDMS_OrderForm_ID)
同一次逻辑里还会维护(但非 orderform 字段):
•    DMS_RProductFamilyPMUserRelation(培训人员关系增删)
结论:CC4 改 order form 时,不会改 EDMS_OrderForm 主数据本身,而是改“引用关系”。
---
3) 全量排查:哪些功能使用了 orderform 相关表
A. order form 主数据维护
•    功能:DMS_ProductCategroy(名称虽叫 ProductCategroy,实际映射 EDMS_OrderForm)
•    证据:
•    FC_DMS_ProductCategroy.xml -> TableMapping tableName="EDMS_OrderForm"
•    VC_DMS_ProductCategroy.xml -> TableMapping tableName="EDMS_OrderForm"
•    明细配置使用 EDMS_OrderFormDetail(FC/VC_DMS_ProductCategroyDetail.xml)
B. CC4 维护时选择并同步 order form
•    功能:DMS_RProductFamily 编辑(UpdateProductSalesteam)
•    涉及表:
•    DMS_RProductFamily.FK_EDMS_OrderForm_ID
•    DMS_Product.FK_EDMS_OrderForm_ID
C. 经销商“最小采购金额”配置(按经销商 + order form)
•    功能:
•    DMS_DistributorPurchaseOrderSum
•    DMS_DistributorPurchaseOrderSumTimeCtrl
•    对应放大镜:VC_DMS_DistributorPurchaseOrderSum_EDMS_OrderForm、VC_OrderSumTimeCtrl_EDMS_OrderForm
•    涉及表:
•    DMS_DistributorPurchaseOrderSum(FK_EDMS_OrderForm_ID, FK_DMS_DistributorInfo_ID, PurchaseOrderSum)
•    DMS_DistributorPurchaseOrderSumTimeCtrl(FK_EDMS_OrderForm_ID, FK_DMS_DistributorInfo_ID, StartTime, EndTime)
D. 下单金额校验/补偿计算对 order form 的使用
•    功能:
•    EDMS_OrderInfo.queryOrderSum(...)
•    DMSEDMS_OrderInfo.queryDMSOrderSum(...)
•    逻辑:
•    使用订单里的 a_FK_OrderForm_ID 去查 DMS_DistributorPurchaseOrderSum / ...TimeCtrl
•    用于最小采购金额门槛判断
E. 订单与 order form 关系
•    表字段:
•    EDMS_OrderInfo.FK_OrderForm_ID
•    代码:
•    CT_EDMS_OrderInfoUp 更新该字段
•    CT_getOrderFormIDByID / QueryOrderFormID(...) 按订单取 OrderForm
---