Compare commits

...
310 Commits
Author SHA1 Message Date
wule ba6da5e85f 修复拍单余额查看闪退bug 优化每单拍单金额逻辑 2026-11-09 11:02:04 +08:00
wule ec13db7cc1 新版本号 2026-11-08 15:16:14 +08:00
wule a03f00fcdb 新版本号 2026-11-08 14:41:54 +08:00
wule_5900x 942ca54dd8 繁体地址需要权限才可使用 2026-11-08 14:41:15 +08:00
wule 6e8ff468f8 新版本号 2026-11-07 22:35:56 +08:00
wule_5900x ac93305d5f 1 修复淘宝拍单窗口可能崩溃问题
2 拼多多中转仓拍单随机地址支持随机繁体字
2026-11-07 22:35:03 +08:00
wule 5b9ed01fa1 1可设置是否直发拍单 2优化订单取号状态判断逻辑 2026-11-06 22:20:18 +08:00
wule 9789a4686f 修复退货包裹按钮功能写反的bug 2026-11-06 21:18:36 +08:00
wule 1ee4c99647 修复拍单后不能立即作废的bug 2026-11-06 18:01:18 +08:00
wule 8fc0e404c3 修复拍单后不能立即作废订单的问题 2026-11-06 17:55:46 +08:00
wule c4c54fc03e 新版本号 2026-11-06 17:00:13 +08:00
wule d43cf21afc Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-11-06 16:58:53 +08:00
wule 7ac3c67242 放开淘宝直拍,优化拍单按钮显示逻辑 2026-11-06 16:58:47 +08:00
wule 72c85ca3f1 新版本号 2026-11-06 16:12:24 +08:00
wule 518365a0d3 优化中转仓处理拍单流程 隐藏部分不可用功能 2026-11-06 16:11:23 +08:00
wule 27ac748f33 新版本号 2026-11-05 20:12:16 +08:00
wule 3483c99d37 修复买手退款异常单异常重拍按钮不显示的bug 2026-11-05 19:56:42 +08:00
wule a4bc9a788e 新版本号 2026-11-04 10:07:02 +08:00
wule 8f7e190974 优化订单处理 2026-11-04 10:05:52 +08:00
wule 85259d8335 显示买手退款详情 2026-11-03 13:38:50 +08:00
wule 5777c30048 新版本号 2026-11-02 19:28:16 +08:00
wule c40e591317 1更新上海仓库地址 2修复作废售后单后无法再次创建问题 2026-11-02 19:26:55 +08:00
wule 54986faa50 新版本号 2026-11-01 16:11:09 +08:00
wule_5900x 30808d56e8 优化直发单售后判断逻辑 2026-11-01 16:09:55 +08:00
wule_5900x 679f6cc9e6 修复云仓买手秒退导致直发退货仓无法提交的问题 2026-10-31 16:33:19 +08:00
wule a5889085d4 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-30 20:43:22 +08:00
wule 6d3f9e4118 中转仓详情作废发货包裹功能 2026-10-30 20:43:13 +08:00
wule 96214a54ea 新版本号 2026-10-30 17:33:38 +08:00
wule f167c2585d 修复售后单数量不足10条时漏单问题 2026-10-30 17:33:02 +08:00
wule 671ca453e0 新版本号 2026-10-30 17:12:54 +08:00
wule da01c9f83f 同上一条 2026-10-30 17:11:55 +08:00
wule 70996d5409 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-30 17:11:31 +08:00
wule bf3b6487f0 云仓详情页作废退货包裹功能 2026-10-30 17:11:19 +08:00
wule be8c0bd1e2 新版本号 2026-10-29 20:11:31 +08:00
wule cefea9dc1a Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-29 20:00:19 +08:00
wule 430bf8d574 修复包裹拒收功能报错 2026-10-29 20:00:14 +08:00
wule e08b4797cb 新版本号 2026-10-29 14:06:00 +08:00
wule 679bd39144 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-29 14:05:14 +08:00
wule 1a5f40926b 修改拦截工单链接地址及其他一些改动 2026-10-29 14:05:04 +08:00
wule 6029eda6de 新版本号 2026-10-29 11:32:41 +08:00
wule 9545de7684 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-29 11:31:19 +08:00
wule 6b8557f8b2 修复退货包裹无法创建问题 2026-10-29 11:31:12 +08:00
wule 4b34090cec 新版本号 2026-10-28 14:04:25 +08:00
chfei d76cf5c342 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-28 14:04:02 +08:00
chfei d70b74ee4a 工单 增加图片复制 2026-10-28 14:03:54 +08:00
wule 1172670a7e Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-28 13:21:38 +08:00
wule be0be1866d 新版本号 2026-10-28 13:21:33 +08:00
wule a31b87b512 优化读拼多多买手单 2026-10-28 13:17:51 +08:00
chfei f89670877d Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-27 17:44:45 +08:00
chfei a9f3ed81af 修复 消费记录导出内容格式化错误 2026-10-27 17:44:38 +08:00
wule 5530b4be2d 修复云仓详情按钮不显示的bug 2026-10-27 17:41:53 +08:00
wule adc3649b59 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-27 17:28:03 +08:00
wule 2d788bd8b1 查看云仓数据按钮 2026-10-27 17:27:54 +08:00
wule 3dd65bdccc 新版本号 2026-10-27 17:02:19 +08:00
wule c79758f235 优化淘宝买手售后读取 2026-10-27 17:01:51 +08:00
wule e01d9a4681 优化订单读取 显示中转仓状态 2026-10-27 16:12:27 +08:00
wule 3f618707da 新版本号 2026-10-27 10:21:58 +08:00
wule 8e581196af 注释等小改动 2026-10-27 10:19:49 +08:00
wule cb61749cda 仓库单详情列表 中转仓退货包裹如果没有物流使用买手物流 2026-10-27 10:16:34 +08:00
wule c1352264a9 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-27 10:00:40 +08:00
chfei 61f0fc0edd 修复工单对话列表不能复制bug 2026-10-27 09:11:27 +08:00
wule 279ca6e8e9 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-26 15:27:31 +08:00
wule f8af5730d3 退货包裹批量展示 2026-10-26 15:27:29 +08:00
wule fe50ca114a 新版本号 2026-10-26 14:53:19 +08:00
wule fb7b623a9f Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-26 14:50:49 +08:00
chfei 39cf75fcbb Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-26 14:50:23 +08:00
chfei 26bf67265d 修复 开票出现错误停止开票的bug 2026-10-26 14:50:13 +08:00
wule 37d879c3e5 model更新 2026-10-26 01:45:07 +08:00
wule fda30c824a 1 退货物流信息如果中转表没有从买手单表读取 2仓库详细信息 2026-10-25 22:10:39 +08:00
wule 19f48e9e6f 新版本号 2026-10-24 20:57:37 +08:00
wule e492457516 修复显示作废(显示错误)订单无法作废重拍的问题 2026-10-24 20:56:08 +08:00
wule 04584600c8 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-24 11:26:04 +08:00
wule b466645640 中转订单详情 2026-10-24 11:25:55 +08:00
wule 2186281fb5 新版本号 2026-10-23 19:44:41 +08:00
wule 78d8f79089 新版本号 2026-10-23 19:44:18 +08:00
wule 526b009f5e Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-23 19:43:44 +08:00
wule 13cb427d2f 显示订单读取总页数 2026-10-23 19:43:40 +08:00
wule 941f48c8b8 新版本号 2026-10-23 19:39:27 +08:00
wule bcc934c1ba 优化读单卡顿问题 2026-10-23 19:38:28 +08:00
wule 8e88e0f5d7 新版本号 2026-10-23 13:51:57 +08:00
chfei 102af9a15c Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-23 13:49:28 +08:00
chfei e1daca428c 增加 工单 提示 2026-10-23 13:49:18 +08:00
wule 727ed7b8ec 新版本号 2026-10-23 09:46:06 +08:00
wule 2cb616b50a Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-23 09:45:48 +08:00
wule f8e68a6322 优化自动拍单优惠券逻辑 2026-10-23 09:45:39 +08:00
wule 7471b707f1 新版本号 2026-10-22 20:16:19 +08:00
wule 8ec1b63f8a 小改动 2026-10-22 20:12:45 +08:00
wule a37744b284 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-22 20:07:40 +08:00
wule 3af9a8017a 自动领店铺优惠券 修复平台服务费不显示问题 2026-10-22 20:07:35 +08:00
wule fc83308711 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-22 16:16:30 +08:00
wule e63d6c896c 新版本号 2026-10-22 16:16:24 +08:00
wule 3f3477d3f4 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-22 16:15:49 +08:00
wule 50a0668278 服务器优化 2026-10-22 16:15:42 +08:00
chfei 1803a4e5e9 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-22 09:48:19 +08:00
chfei 6ed2cede16 工单 增加 接收服务端推送的新工单,支持 推送增加消息 2026-10-22 09:48:12 +08:00
wule 2915056795 新版本号 2026-10-21 20:03:25 +08:00
wule 103b2a1a4a 优化订单读取与拍单逻辑 2026-10-21 20:01:53 +08:00
wule e02047ae57 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-21 15:32:32 +08:00
wule a6e8e5b8cd 优化店铺列表展示 2026-10-21 15:31:59 +08:00
wule 12e9defdb5 新版本号 2026-10-21 12:21:17 +08:00
chfei f0f1f1ed9e Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-21 12:17:31 +08:00
chfei 1d5b6ba0e4 工单 修复 微信复制图片上传不展示的bug 2026-10-21 12:17:24 +08:00
wule c7a87cac28 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-21 11:59:19 +08:00
wule 4d7fd2c157 拼多多买手读单优化 2026-10-21 11:59:12 +08:00
chfei 9c62e0c03d Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-21 11:30:47 +08:00
chfei 483d87f57d 增加发票助手 开票过程中错误提示 2026-10-21 11:30:39 +08:00
wule b63dacfe7e 售后单读取 2026-10-20 18:37:48 +08:00
wule c76e5c9663 新版本号 2026-10-20 17:04:58 +08:00
chfei 3affb4a732 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-20 17:03:29 +08:00
chfei cf2efbcb16 工单 优化 ,增加图片 2026-10-20 17:03:23 +08:00
wule af43e6aed5 新版本号 2026-10-20 14:20:28 +08:00
wule 0b94c43fab Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-20 14:14:00 +08:00
wule fd07c9ba40 优化买手单读取 2026-10-20 14:13:55 +08:00
wule 221c0e6648 新版本 2026-10-20 11:35:57 +08:00
chfei bf5a70597c Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-20 11:34:43 +08:00
chfei 6e5dfa92b8 修复 工单第一次连接失败bug
增加工单内log
2026-10-20 10:20:57 +08:00
wule f5c8baef9a 新版本 2026-10-19 19:59:35 +08:00
chfei 324ca0c6e7 优化工单商铺数量限制 2026-10-19 19:58:23 +08:00
chfei f6eef23f96 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-19 19:58:07 +08:00
chfei ddb23544c7 移除工单商铺数量限制 2026-10-19 19:58:01 +08:00
wule 7380763c1d 优化店铺读取 2026-10-19 19:55:26 +08:00
wule 707efc1723 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-19 19:22:09 +08:00
wule f722993c3d 优化店铺读取 2026-10-19 19:22:04 +08:00
wule b7c682ef10 新版本 2026-10-19 18:47:49 +08:00
chfei 62e80d3c75 启动工单 日志修复 2026-10-19 18:45:14 +08:00
chfei f7851320ba 工单修改店铺50个bug 2026-10-19 18:42:17 +08:00
wule 12fe0c26fb 新版本 2026-10-19 18:19:45 +08:00
wule d36774ea18 订单排序,优化异常重拍 2026-10-19 18:18:02 +08:00
chfei fd0ff6771f Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-19 18:05:27 +08:00
chfei e96871a87a 修复工单 推送连接失败bug 2026-10-19 18:05:20 +08:00
wule e04e4e5108 新版本号 2026-10-19 16:12:45 +08:00
wule 06e6fe89bc Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-19 16:11:56 +08:00
wule c868460cd7 修复读单报错跳出问题 2026-10-19 16:11:54 +08:00
wule 7eea26cdda 更新版本 2026-10-19 15:14:03 +08:00
wule e4b1a24ddb Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-19 15:13:22 +08:00
wule b74e4598a7 优化读单 2026-10-19 15:13:18 +08:00
chfei c999a80048 增加日志
工单连接增加日志
2026-10-19 15:09:51 +08:00
chfei 1b0aa81263 工单增加连接失败日志 2026-10-19 14:53:47 +08:00
chfei 8e0cc20649 修复工单Bug 2026-10-19 14:35:25 +08:00
wule 7982f7e348 新版本号 2026-10-19 14:23:21 +08:00
wule 17728c074c 优化图片显示 2026-10-19 14:22:25 +08:00
wule 1d4867ebf2 新版本 2026-10-19 14:10:42 +08:00
wule eb6b1c5651 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-19 13:24:03 +08:00
wule bbac29ac78 继续优化读单 2026-10-19 13:23:50 +08:00
chfei cf15ef194f Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-19 10:18:04 +08:00
chfei a217a74868 更新JSON格式化
增加剪切板helper
2026-10-19 10:17:43 +08:00
wule 3d86e986b0 合并冲突 2026-10-19 09:12:50 +08:00
wule aad92e8f8e 继续优化读单 2026-10-19 09:06:05 +08:00
chfei d3488c98f5 增加 sse服务端测试 2026-10-18 20:36:40 +08:00
chfei fe87aece4e hb 2026-10-18 20:36:25 +08:00
chfei 10bb0803d9 修改工单流程页面,订单列表增加工单按钮 2026-10-18 20:35:47 +08:00
wule 4ed7346aa8 新版本 2026-10-18 17:20:14 +08:00
wule 7df2cc0957 修复关联失败问题 继续优化读单 2026-10-18 17:18:30 +08:00
wule a786ba6ce9 1新版本 2优化图片显示 2026-10-18 14:22:41 +08:00
wule 41b240c066 新版本 2026-10-18 14:00:56 +08:00
wule b6b4693c86 新版本328 2026-10-18 09:39:02 +08:00
wule_5900x 7c5f083784 修复淘宝买手切换卡死问题 2026-10-18 09:36:18 +08:00
wule 52b1e9eb90 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-18 08:11:08 +08:00
wule 06e45bf587 优化读取订单的展示 2026-10-18 08:09:48 +08:00
wule_5900x bd3bde553b 小修改 2026-10-18 08:08:43 +08:00
chfei 41b12d1284 修改启动项 2026-10-17 18:28:45 +08:00
chfei f9dcae4610 增加工单模块 2026-10-17 18:18:05 +08:00
chfei dc136e449e Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-17 18:17:46 +08:00
chfei 1eb5315261 修改 主程序下的Comm文件夹 转到 Frameork中 2026-10-17 18:16:55 +08:00
wule_5900x b827c6e118 把绑定的数据的计算移动到线程里 2026-10-17 15:33:24 +08:00
wule 2f9c98b105 继续优化订单读取和展示 2026-10-17 09:37:11 +08:00
wule 1509e0a11d 优化订单读取卡顿问题 2026-10-17 07:13:38 +08:00
wule c83521f36d 新版本 2026-10-16 17:30:03 +08:00
chfei e00cf2d573 Merge branch 'main' of http://git.ts.e57.cn/chfei/29WxOrder 2026-10-16 17:28:41 +08:00
chfei 2465b38e65 修复 发票 全选 数字显示错误Bug 2026-10-16 17:28:35 +08:00
wule abca4c996b 新版本 2026-10-16 12:05:20 +08:00
wule ebccdbc28c 拼多多拍单关联闪退修复 2026-10-16 12:04:12 +08:00
wule b2d6d81e07 测试切换地址 2026-10-16 10:22:12 +08:00
wule 9cca38beff 版本号更新 2026-10-16 10:12:04 +08:00
wule 75aae91b66 优化拍单 修复异常拍单和状态不准确订单无法拦截退回问题 2026-10-16 10:11:22 +08:00
wule e71ef72475 修复拍单问题 2026-10-15 17:57:11 +08:00
wule a89adafe61 新版本号 2026-10-15 17:42:06 +08:00
wule 9626bc8d8c Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-15 17:37:01 +08:00
wule e7d22984df 淘宝拍单优化 2026-10-15 17:36:34 +08:00
chfei 912837a84b Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-10-15 13:33:35 +08:00
chfei a81ba26de8 优化发票助手 2026-10-15 13:33:08 +08:00
wule ea14ad3af4 优化淘宝拍单界面显示 2026-10-15 11:26:43 +08:00
wule e0dead1b6d Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-15 11:14:29 +08:00
wule 18a4373918 优化拍单 2026-10-15 11:14:14 +08:00
wule 4873b6cdd5 新版本 2026-10-14 21:13:33 +08:00
wule 79ad130fde Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-14 21:13:05 +08:00
wule a27f6cb33c 优化拍单界面 2026-10-14 21:12:52 +08:00
wule 89299d3e3a 新版本号 2026-10-14 19:56:28 +08:00
wule 84a484a568 淘宝买手售后状态读取 2026-10-14 19:47:27 +08:00
wule 0f850b8840 新版本 2026-10-14 10:32:36 +08:00
wule 4a4d9d7dfb 优化淘宝读买手单逻辑 2026-10-14 08:22:28 +08:00
wule 0244865ace Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-13 18:32:29 +08:00
wule c4363d0ac9 新版本317 2026-10-13 18:26:08 +08:00
wule ade92facab Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-13 18:24:17 +08:00
wule 41fa98dc2d 支持淘宝拍单 2026-10-13 18:24:06 +08:00
chfei 6b36de2494 统计订单详情增加备注提示,
备注可以输入空
2026-10-13 16:58:42 +08:00
wule 4e122fce6e 新版本 2026-10-12 18:51:33 +08:00
wule 5fb42e4d34 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-12 18:48:54 +08:00
wule 60b1088e55 外采淘宝 2026-10-12 18:48:42 +08:00
chfei 064bd1f142 修复开票 过程中出现的错误提示 2026-10-12 18:44:30 +08:00
chfei dd512a0dcb 更新 Dialog弹出框模式 2026-10-12 18:43:32 +08:00
wule_5900x 74e59b4892 淘宝物流读取cef逻辑优化 2026-10-11 21:53:48 +08:00
chfei a01e938055 Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-10-10 20:04:47 +08:00
chfei 66d4d67374 修复订单详情 复制缺少备注 2026-10-10 20:04:14 +08:00
wule 28c112794d Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-10 19:00:23 +08:00
wule b84ccc4670 1淘宝拍单 2中转仓订单优化 2026-10-10 18:59:37 +08:00
chfei e3c91177f6 更改统计页面大小位置 2026-10-09 17:19:27 +08:00
chfei 77843a54f6 Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-10-09 17:16:08 +08:00
chfei cc0904c728 增加 利润明细
移除有效订单明细
增加待退回金额明细 列表备注功能
2026-10-09 17:15:50 +08:00
wule 10ae4c0cf9 新版本号 2026-10-09 16:22:49 +08:00
wule eeee1affd3 仓库订单任何状态都可以拦截寄回总店 2026-10-09 16:21:48 +08:00
wule a4802f4ba1 淘宝异常拍单功能 2026-10-09 15:55:28 +08:00
wule 92fc8cf5b8 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-09 13:58:34 +08:00
wule 890c0a6a11 淘宝中转仓拍单完成 2026-10-09 13:58:21 +08:00
chfei 8d4d3157a2 Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-10-08 16:16:36 +08:00
chfei 87a0d34526 统计订单列表页 增加退款成功按钮 2026-10-08 16:16:19 +08:00
wule 88846e401b 新版本号 2026-10-08 15:00:29 +08:00
chfei 1ed9d72815 Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-10-08 12:07:43 +08:00
chfei 8431a8f6b0 修改统计功能 使用新API接口 2026-10-08 12:07:30 +08:00
wule a46d0f6c9a 升级版本 2026-10-07 20:20:17 +08:00
wule 9d0646805d Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-07 20:14:51 +08:00
wule da4f20ef3b 1淘宝拍单 2修复直发售后处理逻辑错误问题 2026-10-07 20:14:33 +08:00
chfei 03f71a5d64 增加 统计页面订单列表 搜索,复制表格。window层级
增加 toast提示 可以作用域任何window
2026-10-07 16:16:55 +08:00
wule b1e03ddbb1 修复退货仓不能自动执行的问题 2026-10-06 18:46:59 +08:00
wule d706384253 修改补发/修改物流按钮显示逻辑 2026-10-06 15:19:58 +08:00
wule 7dbecfa764 新版本号 2026-10-05 18:54:47 +08:00
wule 26f2fb9fd2 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-05 18:23:30 +08:00
wule c11dda0341 淘宝买手拍单 订单补发包裹。 2026-10-05 18:23:15 +08:00
chfei f7c1d7967b 更新设置加载位置 2026-10-05 13:48:38 +08:00
chfei 5003ea93f8 增加设置页面
增加礼物发货 超出6元 则发礼物二
2026-10-05 13:43:26 +08:00
wule d18460c83f 淘宝拍单更新 2026-10-05 09:03:08 +08:00
wule 1c005f6021 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-10-05 07:37:58 +08:00
wule c993e00f15 淘宝拍单 2026-10-05 07:37:45 +08:00
wule 0bd3233fdf 更新版本 2026-10-04 22:04:58 +08:00
wule 37cb8e86ae 1同步物流单可以手动编辑取件码 2优化上海退货仓退货地址匹配逻辑 2026-10-04 21:32:39 +08:00
wule 0b47a16eb9 解决部分按钮不能点击的问题。 2026-10-02 09:28:56 +08:00
wule d109a90302 淘宝拍单45% 优化中转仓拒收拦截退货等相关操作 拍单地址未修改的拦住付款按钮 2026-09-30 19:38:21 +08:00
wule f27ddca730 淘宝买手拍单30% 2026-09-29 18:34:12 +08:00
wule 080fc7e4c4 新版本 2026-09-28 19:27:56 +08:00
wule d2a91db5e4 订单完成从异常单移除 2026-09-28 19:21:25 +08:00
wule b5b2693990 1淘宝拍单准备, 2异常重拍的订单创建拦截退货后无法读取结果问题修复 2026-09-28 18:34:37 +08:00
wule 040fe6ff52 百度查询中转仓拒收是否真正成功功能 2026-09-27 22:22:30 +08:00
wule 2f1de60845 优化取件码逻辑 2026-09-27 14:31:23 +08:00
wule 259b8027d3 优化拍单代发相关流程 2026-09-27 11:08:01 +08:00
wule abb2759bdf 上一版本漏提交文件提交 2026-09-26 06:28:22 +08:00
wule d9c0749093 支持在订单列表页面重试发送同步单功能 2026-09-26 06:26:32 +08:00
wule e1e118cc61 优化同步单发货逻辑支持手动发货 2026-09-25 18:17:06 +08:00
wule 064d360de7 1直发买手单号查询 2优化同步单逻辑 2026-09-25 13:56:42 +08:00
wule 661f8c052e 中转仓补发包裹 2026-09-24 22:03:52 +08:00
wule 02294e0ef6 新版本号292 2026-09-24 12:05:13 +08:00
wule e1d940fa8c 修复同步单错误无法提交问题 2026-09-24 11:57:16 +08:00
wule ce8fb3f311 同步物流单功能 2026-09-24 10:29:44 +08:00
wule 78ef8eedf3 淘宝买手登录 70% 2026-09-22 09:51:42 +08:00
wule 97278249ae 新版本 2026-09-21 10:52:46 +08:00
wule 59e427fd47 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-21 10:50:57 +08:00
wule fbedea9188 中转仓地址编号变更 2026-09-21 10:50:45 +08:00
chfei 86d30e57d1 批量开票增加停止 2026-09-21 09:49:26 +08:00
chfei 32976d41cd Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-09-20 18:49:43 +08:00
chfei d8064b95ef 修改消费记录总金额计算方法 2026-09-20 18:49:33 +08:00
wule a9685e228c Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-20 17:56:23 +08:00
wule 068ede88e0 中转仓地址修改 2026-09-20 17:56:09 +08:00
wule 8e747f8e18 新版本 2026-09-18 15:42:22 +08:00
wule ec02e2a0e4 自动拍单逻辑优化 2026-09-18 15:40:39 +08:00
chfei 107bf82f97 Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-09-18 14:33:08 +08:00
chfei 9e62672013 发票助手修改,增加时间范围,增加上次读取历史,修复bug 2026-09-18 14:32:52 +08:00
wule 44b4971861 发布新版本 2026-09-18 12:25:53 +08:00
wule 4344c8fd51 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-18 12:22:25 +08:00
wule db6774dbda 1显示最新一条物流信息和展示完整物流轨迹 2优化订单48小时或72小时过滤逻辑 2026-09-18 12:21:17 +08:00
wule 43d5761ce5 发版本 2026-09-17 10:22:39 +08:00
wule 657786bbe7 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-17 04:36:46 +08:00
wule f3fa093709 修复备注编辑不显示问题 2026-09-17 04:36:21 +08:00
wule 394f5cbf54 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-16 20:38:08 +08:00
wule cbacc242db 订单修改发货功能,订单拦截结果显示 2026-09-16 20:34:28 +08:00
wule d8e10993d6 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-16 10:15:17 +08:00
wule f3ec329e77 订单筛选功能优化 2026-09-15 20:01:59 +08:00
wule 05099584c8 Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-15 15:00:37 +08:00
wule 010de0c16b 更新版本号 2026-09-15 15:00:24 +08:00
wule 9ce8c6e6bc 1展示店铺运费收益及相关计算 2优化部分数据展示 2026-09-15 14:27:21 +08:00
wule 1b634434c2 优化不同订单状态下操作功能 2026-09-14 20:37:50 +08:00
wule c25ec3a89a 修复拍单订单空白记录问题 2026-09-12 18:57:28 +08:00
wule e755da09a6 自动拍单功能 2026-09-12 13:10:51 +08:00
wule 5906a1623f 1自动拍单功能(暂未开放) 2026-09-11 18:53:38 +08:00
chfei b42c17c013 编码错误修复 2026-09-11 18:52:00 +08:00
chfei 330ccf3983 更新 发票助手 按照时间正序 2026-09-11 18:02:47 +08:00
wule 786697c5a6 修改拼写错误 2026-09-11 13:30:15 +08:00
wule dd5b526fd2 修改控件类型 2026-09-11 11:53:57 +08:00
wule a287994b31 版本更新 2026-09-11 11:43:28 +08:00
wule b03753e0cf 1优化订单列表展示 2拍单逻辑优化调整 3自动拍单 2026-09-11 11:41:54 +08:00
wule b2d91563ed 修复直拍买手单多条退货记录时显示错误问题 2026-09-09 19:20:43 +08:00
chfei 3579fac394 Merge branch 'main' of github.com:jtt-fan/29WxOrder 2026-09-09 18:41:01 +08:00
chfei c0e3b998ac 发票助手 增加 发票状态筛选,修复不能选中bug,修复开票失败bug 2026-09-09 18:40:50 +08:00
wule 580afd1331 礼物单显示文本修改 2026-09-08 17:31:32 +08:00
chfei df340c920a x修复 采购单号 不能复制的bug 2026-09-08 11:31:55 +08:00
chfei a275ac8333 修复 button UI 错误 2026-09-08 11:21:06 +08:00
chfei 7a4dba5cd8 修改订单列表页UI 2026-09-08 10:10:01 +08:00
chfei 599b74a880 修改订单详情UI 布局控件 2026-09-07 17:29:58 +08:00
wule 1d99df85fe 发版,一些细节及小bug修改 2026-09-06 23:20:02 +08:00
wule e521eee8df Merge branch 'main' of github.com:KJD2025/29WxOrder 2026-09-06 19:33:20 +08:00
wule b68a07f03a 修改文字错误 2026-09-06 19:33:00 +08:00
wule 7e8ac20bb1 发新版 2026-09-06 19:22:16 +08:00
wule d1bcdc9815 同上一条 2026-09-06 19:13:34 +08:00
wule 8e33d095f3 用户拍单可以通过商品选择sku 2026-09-06 18:56:37 +08:00
chfei ec4d8073b3 修复复制 提示错误bug 2026-09-05 15:10:53 +08:00
wule 99c1fe83ef 订单增加礼物单退费显示 2026-09-04 15:04:04 +08:00
wule a2aa257c29 记录关联商品所有sku并可以快速关联 2026-09-02 22:02:16 +08:00
wule 5528d82d43 修复拍单后到再次读单前,拍单时间显示错误问题。 2026-09-01 22:42:24 +08:00
chfei 8d9ed2f451 统计页面增加明细按钮 2026-09-01 16:09:03 +08:00
chfei a5d049da81 修复登录后不能自动关闭bug 2026-09-01 15:06:10 +08:00
chfei 20bfd2c22c 修复登录 UI线程bug 2026-09-01 14:55:43 +08:00
chfei 0eae9f7706 修改主窗口 header 拖动bug.
拼多多登录 改为WPF 。PddMobileLoginForm 不再使用
2026-09-01 14:34:26 +08:00
268 changed files with 55829 additions and 13816 deletions

No files matched your search

+63
View File
@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
+20 -2
View File
@@ -25,6 +25,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".test", ".test", "{14261B9B
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WXOrder.Test", "test\WXOrder.Test\WXOrder.Test.csproj", "{3790EC79-EA1D-4660-AB0D-EA0DE4FF77B7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrderSupportTicket", "OrderSupportTicket\OrderSupportTicket.csproj", "{22D31944-2087-437A-B374-C0874E9EC53A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -73,8 +75,8 @@ Global
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|x64.ActiveCfg = Debug|Any CPU
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|x64.Build.0 = Debug|Any CPU
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|x64.ActiveCfg = Debug|x64
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|x64.Build.0 = Debug|x64
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|x86.ActiveCfg = Debug|Any CPU
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Debug|x86.Build.0 = Debug|Any CPU
{5A410EB5-06AD-97BB-2314-9D7A808E12F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -117,6 +119,22 @@ Global
{3790EC79-EA1D-4660-AB0D-EA0DE4FF77B7}.Release|x64.Build.0 = Release|Any CPU
{3790EC79-EA1D-4660-AB0D-EA0DE4FF77B7}.Release|x86.ActiveCfg = Release|Any CPU
{3790EC79-EA1D-4660-AB0D-EA0DE4FF77B7}.Release|x86.Build.0 = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|x64.ActiveCfg = Debug|x64
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|x64.Build.0 = Debug|x64
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|x86.ActiveCfg = Debug|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Debug|x86.Build.0 = Debug|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|Any CPU.Build.0 = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|x64.ActiveCfg = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|x64.Build.0 = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|x86.ActiveCfg = Release|Any CPU
{22D31944-2087-437A-B374-C0874E9EC53A}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
+18
View File
@@ -12,6 +12,7 @@
<OutputPath>..\bin\</OutputPath>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
@@ -37,6 +38,7 @@
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
@@ -57,6 +59,7 @@
<ItemGroup>
<ProjectReference Include="..\AllBase\29WxOrderAllBase.csproj" />
<ProjectReference Include="..\OrderSupportTicket\OrderSupportTicket.csproj" />
<ProjectReference Include="..\Work\29WxOrderWork.csproj" />
<ProjectReference Include="..\WxOrder.Framework\WxOrder.Framework.csproj" />
</ItemGroup>
@@ -64,11 +67,26 @@
<!-- 资源文件:SDK 样式工程默认不会把图片/图标作为 Resource,这里按原工程显式声明 -->
<ItemGroup>
<Resource Include="Resources\**\*" />
<None Remove="Ctrls\BuyerCtrls\Resources\pdd_afterorder.js" />
<None Remove="Ctrls\PDDInvoice\Resources\invoice.js" />
<None Remove="Ctrls\PDDInvoice\Resources\order.js" />
<Resource Include="29wx.ico" />
<Resource Include="29_common_icon.ico" />
<Resource Include="Ctrls\BuyerCtrls\Resources\pdd_afterorder.js" />
<Resource Include="Ctrls\PDDInvoice\Resources\invoice.js" />
<Resource Include="Ctrls\PDDInvoice\Resources\order.js" />
<Resource Include="gear.ico" />
</ItemGroup>
<ItemGroup>
<Compile Update="Ctrls\BuyerCtrls\PddBuyOrderCtrl.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Views\ChangePickNoView.xaml.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="Common\" />
</ItemGroup>
</Project>
@@ -0,0 +1,90 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net462</TargetFramework>
<RootNamespace>_29WxOrderWpf</RootNamespace>
<AssemblyName>29WxFindOrder</AssemblyName>
<UseWPF>true</UseWPF>
<ApplicationIcon>gear.ico</ApplicationIcon>
<LangVersion>12</LangVersion>
<PlatformTarget>x64</PlatformTarget>
<OutputPath>..\bin\</OutputPath>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<PlatformTarget>x64</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\KJD Cef138\Bin\</OutputPath>
<DefineConstants>TRACE;RELEASE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CefSharp.Common" Version="138.0.340" />
<PackageReference Include="CefSharp.Wpf" Version="138.0.340" />
<PackageReference Include="chromiumembeddedframework.runtime.win-x64" Version="138.0.34" />
<PackageReference Include="chromiumembeddedframework.runtime.win-x86" Version="138.0.34" />
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
<PackageReference Include="WPFCommon" Version="1.2.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Xaml" />
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<Reference Include="NaiBa.Util">
<HintPath>..\DllReference\NaiBa.Util.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AllBase\29WxOrderAllBase.csproj" />
<ProjectReference Include="..\OrderSupportTicket\OrderSupportTicket.csproj" />
<ProjectReference Include="..\Work\29WxOrderWork.csproj" />
<ProjectReference Include="..\WxOrder.Framework\WxOrder.Framework.csproj" />
</ItemGroup>
<!-- 资源文件:SDK 样式工程默认不会把图片/图标作为 Resource,这里按原工程显式声明 -->
<ItemGroup>
<Resource Include="Resources\**\*" />
<None Remove="Ctrls\PDDInvoice\Resources\invoice.js" />
<None Remove="Ctrls\PDDInvoice\Resources\order.js" />
<Resource Include="29wx.ico" />
<Resource Include="29_common_icon.ico" />
<Resource Include="Ctrls\PDDInvoice\Resources\invoice.js" />
<Resource Include="Ctrls\PDDInvoice\Resources\order.js" />
<Resource Include="gear.ico" />
</ItemGroup>
<ItemGroup>
<Compile Update="Ctrls\BuyerCtrls\PddBuyOrderCtrl.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Views\ChangePickNoView.xaml.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="Common\" />
</ItemGroup>
</Project>
+38 -37
View File
@@ -1,40 +1,41 @@
<Application
x:Class="_29WxOrderWpf.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:_29WxOrderWpf.Converters"
xmlns:local="clr-namespace:_29WxOrderWpf"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<converters:HasValueToVisibilityConverter x:Key="hasValueToVisibilityConverter" />
<converters:HasTextToVisibilityConverter x:Key="HasTextVisibility" />
<converters:TextEllipsisConverter x:Key="TextEllipsisConverter" />
<converters:TextEllipsisConverter26 x:Key="TextEllipsisConverter26" />
<converters:NotHasTextToVisibilityConverter x:Key="NotHasTextVisibility" />
<converters:VisibleToVisibilityConverter x:Key="visibleToVisibilityConverter" />
<converters:ImageUrlToBitmapImageConverter x:Key="ImageUrlToBitmapImage" />
<converters:ValueMinus24Converter x:Key="ValueMinus24Converter" />
<converters:FenToYuanConverter x:Key="FenToYuanConverter" />
<converters:StatusToColorBrushConverter x:Key="statusToColorBrushConverter" />
<converters:ListBoxIndexConverter x:Key="listBoxIndexConverter" />
<converters:FlagColorConverter x:Key="flagColorConverter" />
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/BaseWindowStyle.xaml" />
<ResourceDictionary Source="Styles/BaseDataGridStyle.xaml" />
<ResourceDictionary Source="Styles/BaseButtonStyle.xaml" />
<ResourceDictionary Source="Styles/BaseTextBoxStyle.xaml" />
<ResourceDictionary Source="Styles/BaseComboBoxStyle.xaml" />
<ResourceDictionary Source="Styles/UcImageButtonStyle.xaml" />
<ResourceDictionary Source="Styles/UcWaterMarkTextBoxStyle.xaml" />
<ResourceDictionary Source="Styles/StaticImageDictionary.xaml" />
<ResourceDictionary Source="Styles/StaticColorBrushDictionary.xaml" />
<ResourceDictionary Source="Styles/StaticImageBrushDictionary.xaml" />
<!-- 可以添加更多资源字典 -->
<ResourceDictionary Source="/Ctrls/Statistics/General.xaml" />
x:Class="_29WxOrderWpf.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:_29WxOrderWpf.Converters"
xmlns:local="clr-namespace:_29WxOrderWpf">
<Application.Resources>
<ResourceDictionary>
<converters:HasValueToVisibilityConverter x:Key="hasValueToVisibilityConverter" />
<converters:HasTextToVisibilityConverter x:Key="HasTextVisibility" />
<converters:TextEllipsisConverter x:Key="TextEllipsisConverter" />
<converters:TextEllipsisConverter26 x:Key="TextEllipsisConverter26" />
<converters:TextEllipsisConverter8 x:Key="TextEllipsisConverter8" />
<converters:NotHasTextToVisibilityConverter x:Key="NotHasTextVisibility" />
<converters:VisibleToVisibilityConverter x:Key="visibleToVisibilityConverter" />
<converters:ImageUrlToBitmapImageConverter x:Key="ImageUrlToBitmapImage" />
<converters:ValueMinus24Converter x:Key="ValueMinus24Converter" />
<converters:FenToYuanConverter x:Key="FenToYuanConverter" />
<converters:StatusToColorBrushConverter x:Key="statusToColorBrushConverter" />
<converters:ListBoxIndexConverter x:Key="listBoxIndexConverter" />
<converters:FlagColorConverter x:Key="flagColorConverter" />
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/BaseWindowStyle.xaml" />
<ResourceDictionary Source="Styles/BaseDataGridStyle.xaml" />
<ResourceDictionary Source="Styles/BaseButtonStyle.xaml" />
<ResourceDictionary Source="Styles/BaseTextBoxStyle.xaml" />
<ResourceDictionary Source="Styles/BaseComboBoxStyle.xaml" />
<ResourceDictionary Source="Styles/UcImageButtonStyle.xaml" />
<ResourceDictionary Source="Styles/UcWaterMarkTextBoxStyle.xaml" />
<ResourceDictionary Source="Styles/StaticImageDictionary.xaml" />
<ResourceDictionary Source="Styles/StaticColorBrushDictionary.xaml" />
<ResourceDictionary Source="Styles/StaticImageBrushDictionary.xaml" />
<!-- 可以添加更多资源字典 -->
<ResourceDictionary Source="/Ctrls/Statistics/General.xaml" />
<ResourceDictionary Source="pack://application:,,,/WxOrder.Framework;component/Resources/Theme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
<ResourceDictionary Source="pack://application:,,,/WxOrder.Framework;component/Resources/Theme.xaml" />
<ResourceDictionary Source="Styles/TabControlStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
+18 -16
View File
@@ -108,7 +108,7 @@ namespace _29WxOrderWpf
string str = GetExceptionMsg(ex, string.Empty);
NaiBa.Util.Helper.LogHelper.WriteWithTime("SystemError:" + str);
//BaseMsgForm.ShowError(str, "系统错误");
BaseMsgWindow.ShowError(str, "系统错误");
BaseMsgWindow.ShowError(str, "系统错误", null, MsgWindowLevel.LARGE);
}
#region 初始化cef
@@ -141,29 +141,31 @@ namespace _29WxOrderWpf
#endif
Cef.Initialize(settings);
}
#endregion
}
#endregion
//static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
//{
// string str = GetExceptionMsg(e.Exception, e.ToString());
// NaiBa.Util.Helper.LogHelper.WriteWithTime("SystemError:" + str);
// BaseMsgWindow.ShowError(str, "系统错误");
//}
new MainWindow().Show();
}
private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
//static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
//{
// string str = GetExceptionMsg(e.Exception, e.ToString());
// NaiBa.Util.Helper.LogHelper.WriteWithTime("SystemError:" + str);
// BaseMsgWindow.ShowError(str, "系统错误");
//}
private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
string str = GetExceptionMsg(e.Exception, e.ToString());
NaiBa.Util.Helper.LogHelper.WriteWithTime("SystemError:" + str);
BaseMsgWindow.ShowError(str, "系统错误");
}
BaseMsgWindow.ShowError(str, "系统错误", null, MsgWindowLevel.LARGE);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
NaiBa.Util.Helper.LogHelper.WriteWithTime("SystemError:" + str);
BaseMsgWindow.ShowError(str, "系统错误");
}
BaseMsgWindow.ShowError(str, "系统错误", null, MsgWindowLevel.LARGE);
}
/// <summary>
/// 生成自定义异常消息
@@ -188,8 +190,8 @@ namespace _29WxOrderWpf
}
sb.AppendLine("***************************************************************");
NaiBa.Util.Helper.LogHelper.WriteWithTime("Error:" + sb);
BaseMsgWindow.ShowError(sb.ToString(), "系统错误");
return sb.ToString();
BaseMsgWindow.ShowError(sb.ToString(), "系统错误", null, MsgWindowLevel.LARGE);
return sb.ToString();
}
/// <summary>
+21 -16
View File
@@ -1,4 +1,5 @@
using AllBase.Helper;
using NaiBa.Util.Extension;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -49,14 +50,14 @@ namespace _29WxOrderWpf.BaseWindows
BaseMsgWindow msgBox = null;
Window owner = window ?? MainWindow.Instance;
owner.Dispatcher.Invoke(new Action(() =>
{
//owner.Dispatcher.Invoke(() =>
Application.Current.Dispatcher.Invoke(() =>
{
msgBox = CreateMsgForm(msg, title, wl);
msgBox.imgTip.Source = Application.Current.Resources["imgBaseMsgInfo"] as ImageSource;
msgBox.Owner = owner;
//msgBox.Owner = owner;
msgBox.ShowDialog();
}));
});
return msgBox;
}
@@ -65,24 +66,26 @@ namespace _29WxOrderWpf.BaseWindows
string title = string.IsNullOrEmpty(caption) ? "系统错误" : caption;
BaseMsgWindow msgBox = null;
Window owner = window ?? MainWindow.Instance;
owner.Dispatcher.Invoke(new Action(() =>
{
//owner.Dispatcher.Invoke(() =>
Application.Current.Dispatcher.Invoke(() =>
{
msgBox = CreateMsgForm(msg, title, wl);
msgBox.imgTip.Source = Application.Current.Resources["imgBaseMsgErr"] as ImageSource;
msgBox.Owner = owner;
//msgBox.Owner = owner;
msgBox.ShowDialog();
}));
});
return msgBox;
}
public static BaseMsgWindow ShowConfirm(string msg, string caption = "", Window window = null, MsgWindowLevel fl = MsgWindowLevel.MEDIUM)
public static BaseMsgWindow ShowConfirm(string msg, string caption = "", Window window = null, MsgWindowLevel fl = MsgWindowLevel.MEDIUM, int? boxHeight = null)
{
string title = string.IsNullOrEmpty(caption) ? "确认系统提示" : caption;
BaseMsgWindow msgBox = null;
Window owner = window ?? MainWindow.Instance;
owner.Dispatcher.Invoke(() =>
{
//owner.Dispatcher.Invoke(() =>
Application.Current.Dispatcher.Invoke(() =>
{
msgBox = new BaseMsgWindow
{
lblTitle = { Content = title },
@@ -92,9 +95,11 @@ namespace _29WxOrderWpf.BaseWindows
if (fl.Equals(MsgWindowLevel.LARGE))
{
msgBox.Width = (int)MsgWindowLevel.LARGE;
msgBox.Height = 500;
if (boxHeight == null)
boxHeight = 500;
msgBox.Height = boxHeight.ParseToInt();
}
msgBox.Owner = owner;
//msgBox.Owner = owner;
msgBox.ShowDialog();
});
return msgBox;
@@ -119,8 +124,8 @@ namespace _29WxOrderWpf.BaseWindows
MainWindow.Instance.borderMessage.BorderBrush = Application.Current.Resources["pageColorBrush"] as SolidColorBrush;
MainWindow.Instance.tbMessage.Foreground = Application.Current.Resources["pageColorBrush"] as SolidColorBrush;
}
if (type.ToLower() == "error")
{
if (type.ToLower() == "err" || type.ToLower() == "error")
{
MainWindow.Instance.borderMessage.BorderBrush = Application.Current.Resources["PageWarningBrush"] as SolidColorBrush;
MainWindow.Instance.tbMessage.Foreground = Application.Current.Resources["PageWarningBrush"] as SolidColorBrush;
}
-24
View File
@@ -1,24 +0,0 @@
<Window x:Class="_29WxOrderWpf.Common.DialogWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:_29WxOrderWpf.Common"
mc:Ignorable="d"
Title="{Binding Title}"
d:DesignHeight="450"
d:DesignWidth="800"
Background="#FFFFFF"
WindowStartupLocation="CenterOwner">
<Window.Resources>
<Style x:Key="DialogWindowStyle" TargetType="Window">
<Setter Property="Tag" Value="Default"/>
<Setter Property="ResizeMode" Value="NoResize"/>
<Setter Property="ShowInTaskbar" Value="False"/>
<Setter Property="WindowChrome.GlassFrameThickness" Value="-1"/>
</Style>
</Window.Resources>
<Grid>
</Grid>
</Window>
@@ -5,55 +5,192 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using Work;
namespace _29WxOrderWpf.Converters
{
public class ImageUrlToBitmapImageConverter : IValueConverter
{
/// <summary> 缓存上限,防止大量缩略图重复下载导致内存膨胀 </summary>
private const int MaxCacheCount = 200;
public class ImageUrlToBitmapImageConverter : IMultiValueConverter
{
/// <summary> 缓存上限,防止大量缩略图重复下载导致内存膨胀 </summary>
private const int MaxCacheCount = 200;
private readonly ConcurrentDictionary<string, BitmapImage> _imageCache = new ConcurrentDictionary<string, BitmapImage>();
private readonly ConcurrentDictionary<string, BitmapImage> _imageCache = new ConcurrentDictionary<string, BitmapImage>();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string url && Uri.IsWellFormedUriString(url, UriKind.Absolute))
{
if (_imageCache.TryGetValue(url, out BitmapImage cached))
{
return cached;
}
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length == 0 || values[0] == DependencyProperty.UnsetValue)
return null;
var url = values[0] as string;
var isLoad = values[1] is bool b && b;
if (!isLoad || string.IsNullOrEmpty(url))
return null; // 或返回占位图
if (Uri.IsWellFormedUriString(url, UriKind.Absolute))
{
if (_imageCache.TryGetValue(url, out BitmapImage cached))
{
return cached;
}
try
{
// 直接加载绑定如果遇到有问题的网络图片会直接崩溃。
BitmapImage bitMap = AllBase.ImageBuild.LoadBitmipImageFromUrl(url);
if (bitMap != null)
{
if (_imageCache.Count >= MaxCacheCount)
{
_imageCache.Clear();
}
_imageCache[url] = bitMap;
}
return bitMap;
}
catch
{
try
{
// 直接加载绑定如果遇到有问题的网络图片会直接崩溃。
BitmapImage bitMap = AllBase.ImageBuild.LoadBitmipImageFromUrl(url);
if (bitMap != null)
{
if (_imageCache.Count >= MaxCacheCount)
{
_imageCache.Clear();
}
_imageCache[url] = bitMap;
}
return bitMap;
}
catch
{
}
}
return null;
}
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException(); // 不需要反向转换,所以不实现。
}
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
// 建议作为静态字段复用,不要每次调用都 new HttpClient()
private static readonly HttpClient _httpClient = new HttpClient();
}
public class ImageLoadRequest
{
public string Url { get; set; }
public bool IsLoad { get; set; }
// 用于避免相同状态重复触发下载逻辑
public override bool Equals(object obj) =>
obj is ImageLoadRequest other && other.Url == Url && other.IsLoad == IsLoad;
public override int GetHashCode() => Url.GetHashCode();
}
public class ImageLoadRequestConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var url = values[0] as string;
var isLoad = values.Length > 1 && values[1] is bool b && b;
return new ImageLoadRequest { Url = url, IsLoad = isLoad };
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
=> throw new NotSupportedException();
}
public static class AsyncImageLoader
{
private static readonly HttpClient _httpClient = new HttpClient();
private static readonly ConcurrentDictionary<string, Task<BitmapImage>> _cache
= new ConcurrentDictionary<string, Task<BitmapImage>>();
public static readonly DependencyProperty RequestProperty =
DependencyProperty.RegisterAttached(
"Request",
typeof(ImageLoadRequest),
typeof(AsyncImageLoader),
new PropertyMetadata(null, OnRequestChanged));
public static ImageLoadRequest GetRequest(DependencyObject obj) => (ImageLoadRequest)obj.GetValue(RequestProperty);
public static void SetRequest(DependencyObject obj, ImageLoadRequest value) => obj.SetValue(RequestProperty, value);
private static readonly DependencyProperty CurrentUrlProperty =
DependencyProperty.RegisterAttached("CurrentUrl", typeof(string), typeof(AsyncImageLoader), new PropertyMetadata(null));
private static string GetCurrentUrl(DependencyObject obj) => (string)obj.GetValue(CurrentUrlProperty);
private static void SetCurrentUrl(DependencyObject obj, string value) => obj.SetValue(CurrentUrlProperty, value);
private static readonly DependencyProperty CtsProperty =
DependencyProperty.RegisterAttached("Cts", typeof(CancellationTokenSource), typeof(AsyncImageLoader), new PropertyMetadata(null));
private static CancellationTokenSource GetCts(DependencyObject obj) => (CancellationTokenSource)obj.GetValue(CtsProperty);
private static void SetCts(DependencyObject obj, CancellationTokenSource value) => obj.SetValue(CtsProperty, value);
private static void OnRequestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is Image image)) return;
// 值没变(Equals 重写过),不做任何事,避免无意义触发
if (Equals(e.OldValue, e.NewValue)) return;
var request = e.NewValue as ImageLoadRequest;
GetCts(image)?.Cancel();
if (request == null || !request.IsLoad || string.IsNullOrEmpty(request.Url))
{
return; // 滚动中,不加载,保留原图,不产生任何开销
}
string url = request.Url;
SetCurrentUrl(image, url);
var cts = new CancellationTokenSource();
SetCts(image, cts);
// 关键:把真正的下载动作丢到 Dispatcher 队列里、用较低优先级去做,
// 避免在当前这一帧的布局/绑定更新过程中做任何"重"的同步开销,
// 也顺便起到一个天然的"防抖"效果——如果这一帧内 Request 又变了
// (比如滚动中又切回别的 item),上面的 Cancel() 已经先取消了。
image.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(async () =>
{
if (cts.IsCancellationRequested) return;
try
{
var bitmap = await LoadBitmapAsync(url, cts.Token);
if (bitmap != null && GetCurrentUrl(image) == url && !cts.IsCancellationRequested)
{
image.Source = bitmap;
}
}
catch (OperationCanceledException) { }
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error loading image from {url}: {ex.Message}");
}
}));
}
private static Task<BitmapImage> LoadBitmapAsync(string url, CancellationToken token)
{
return _cache.GetOrAdd(url, async u =>
{
using var response = await _httpClient.GetAsync(u, token);
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsByteArrayAsync();
using var stream = new MemoryStream(data);
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.DecodePixelWidth = 200;
bitmap.EndInit();
bitmap.Freeze();
return bitmap;
});
}
}
}
@@ -15,10 +15,13 @@ namespace _29WxOrderWpf.Converters
{
ListBoxItem item = (ListBoxItem)value;
ListBox listView = ItemsControl.ItemsControlFromItemContainer(item) as ListBox;
return listView.ItemContainerGenerator.IndexFromContainer(item) + 1;
}
if (listView == null)
return 0;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
return listView.ItemContainerGenerator.IndexFromContainer(item) + 1;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
@@ -14,7 +14,7 @@ namespace _29WxOrderWpf.Converters
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ( value == null)
if (value == null)
return Visibility.Collapsed;
return !value.ParseToString().Trim().IsNullOrEmpty() ? Visibility.Visible : Visibility.Collapsed;
}
@@ -53,20 +53,36 @@ namespace _29WxOrderWpf.Converters
}
}
/// <summary>
/// 超出26个字的文本显示省略号
/// </summary>
public class TextEllipsisConverter26 : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ParseToString().Length > 26)
return string.Join("", value.ParseToString().Take(26)) + "…";
return value.ParseToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException(); // 单向绑定可不实现
}
}
/// <summary>
/// 超出26个字的文本显示省略号
/// </summary>
public class TextEllipsisConverter26 : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ParseToString().Length > 26)
return string.Join("", value.ParseToString().Take(26)) + "…";
return value.ParseToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException(); // 单向绑定可不实现
}
}
/// <summary>
/// 超出10个字的文本显示省略号
/// </summary>
public class TextEllipsisConverter8 : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ParseToString().Length > 8)
return string.Join("", value.ParseToString().Take(8)) + "…";
return value.ParseToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException(); // 单向绑定可不实现
}
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1,49 +1,247 @@
<UserControl x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.PDDBuyerSelectCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls" xmlns:userctrls="clr-namespace:_29WxOrderWpf.UserControls"
mc:Ignorable="d" Loaded="UserControl_Loaded"
d:DesignHeight="30" d:DesignWidth="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Margin="4,0,0,0" Width="24" Height="24" Source="{StaticResource imgBuyerOrder}" MouseLeftButtonUp="Image_MouseLeftButtonUp" Cursor="Hand"></Image>
<ComboBox Grid.Column="1" x:Name="cmbPddBuyer" Margin="8,0,0,0" VerticalContentAlignment="Center" Style="{StaticResource RoundedComboBox}" Height="24"
MouseLeftButtonUp="cmbPddBuyer_MouseLeftButtonUp" SelectionChanged="cmbPddBuyer_SelectionChanged" SelectedIndex="0">
<ComboBox.ItemTemplate>
<DataTemplate>
<!--<Grid HorizontalAlignment="Stretch" MinWidth="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}">-->
<Grid HorizontalAlignment="Stretch" MinWidth="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}},
Path=ActualWidth, Converter={StaticResource ValueMinus24Converter}}" Height="auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120*"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock x:Name="tbName" Text="{Binding buyer_nick}" VerticalAlignment="Center"/>
<userctrls:UcImageButton Width="15" Height="15" ButtonImage="{StaticResource imgCloseGray}" BorderThickness="0" Cursor="Hand" Grid.Column="0" Visibility="Collapsed"
MouseOverButtonImage="{StaticResource imgCloseGray}" MousePressButtonImage="{StaticResource imgCloseGray}" Background="Transparent"
x:Name="btnDeleteItem" Tag="{Binding ElementName=tbName, Path=Text}" HorizontalAlignment="Right" VerticalAlignment="Center"
Click="btnDeleteItem_Click"/>
<TextBlock x:Name="tbStatus" Text="{Binding status}" Foreground="{Binding status, Converter={StaticResource statusToColorBrushConverter}}" Grid.Column="2"
VerticalAlignment="Center"/>
</Grid>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="btnDeleteItem" Property="Visibility" Value="Visible"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<!--<TextBlock Text="选择买手" Grid.Column="12" Margin="12,0,0,0" VerticalAlignment="Center" IsHitTestVisible="False" Foreground="LightGray"
Visibility="{Binding ElementName=cmbBuyer,Path=Text,Converter={StaticResource NotHasTextVisibility}}"></TextBlock>-->
<Button Grid.Column="2" x:Name="btnLoginPdd" Style="{StaticResource BasePageButtonStyle}" Margin="4,0,0,0"
Content="多多登录" Width="56" Height="24" Click="btnLoginPdd_Click"/>
</Grid>
<UserControl
x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.PDDBuyerSelectCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="WxOrder.Framework"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:userctrls="clr-namespace:_29WxOrderWpf.UserControls"
xmlns:wpf="WPFCommon"
d:DesignHeight="30"
d:DesignWidth="320"
Loaded="UserControl_Loaded"
mc:Ignorable="d">
<Grid Margin="0,0,0,-26">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<wpf:SpacingStackPanel
Grid.Column="1"
VerticalAlignment="Center"
Orientation="Vertical"
VerticalSpacing="2">
<WrapPanel x:Name="wpPddBuyer">
<Image
Width="24"
Height="24"
Margin="4,0,0,0"
Cursor="Hand"
MouseLeftButtonUp="Image_MouseLeftButtonUp"
Source="{StaticResource imgBuyerOrder}" />
<CheckBox
x:Name="chkPddBuyerLogin"
Margin="2,2,2,2"
HorizontalAlignment="Left"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
d:IsChecked="True"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkBuyerLogin_Click"
FontSize="12"
IsChecked="True" />
<ComboBox
x:Name="cmbPddBuyer"
Grid.Column="1"
Width="180"
Height="24"
Margin="0,0,0,0"
VerticalContentAlignment="Center"
MouseLeftButtonUp="cmbPddBuyer_MouseLeftButtonUp"
SelectedIndex="0"
SelectionChanged="cmbPddBuyer_SelectionChanged"
Style="{StaticResource RoundedComboBox}">
<ComboBox.ItemTemplate>
<DataTemplate>
<!--<Grid HorizontalAlignment="Stretch" MinWidth="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}">-->
<Grid
Height="auto"
MinWidth="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth, Converter={StaticResource ValueMinus24Converter}}"
HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<TextBlock
x:Name="tbName"
VerticalAlignment="Center"
Text="{Binding buyer_nick}" />
<userctrls:UcImageButton
x:Name="btnDeleteItem"
Grid.Column="0"
Width="15"
Height="15"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Background="Transparent"
BorderThickness="0"
ButtonImage="{StaticResource imgCloseGray}"
Click="btnDeleteItem_Click"
Cursor="Hand"
MouseOverButtonImage="{StaticResource imgCloseGray}"
MousePressButtonImage="{StaticResource imgCloseGray}"
Tag="{Binding ElementName=tbName, Path=Text}"
Visibility="Collapsed" />
<TextBlock
x:Name="tbStatus"
Grid.Column="2"
VerticalAlignment="Center"
Foreground="{Binding status, Converter={StaticResource statusToColorBrushConverter}}"
Text="{Binding status}" />
</Grid>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="btnDeleteItem" Property="Visibility" Value="Visible" />
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<!--<TextBlock Text="选择买手" Grid.Column="12" Margin="12,0,0,0" VerticalAlignment="Center" IsHitTestVisible="False" Foreground="LightGray"
Visibility="{Binding ElementName=cmbBuyer,Path=Text,Converter={StaticResource NotHasTextVisibility}}"></TextBlock>-->
<Button
x:Name="btnLoginPdd"
Grid.Column="2"
Width="56"
Height="24"
Margin="4,0,0,0"
Click="btnLoginPdd_Click"
Content="多多登录"
Style="{StaticResource BasePageButtonStyle}" />
</WrapPanel>
<WrapPanel
x:Name="wpTaobaoBuyer"
d:Visibility="Visible"
Visibility="Visible">
<Image
x:Name="imgTb"
Width="24"
Height="24"
Margin="4,0,0,0"
Cursor="Hand"
MouseLeftButtonUp="imgTb_MouseLeftButtonUp"
Source="{StaticResource imgBuyerOrder}" />
<CheckBox
x:Name="chkTbBuyerLogin"
Margin="2,2,2,2"
HorizontalAlignment="Left"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkBuyerLogin_Click"
FontSize="12"
IsChecked="False" />
<ComboBox
x:Name="cmbTaobaoBuyer"
Grid.Column="1"
Width="180"
Height="24"
Margin="0,0,0,0"
VerticalContentAlignment="Center"
MouseLeftButtonUp="cmbTaobao_MouseLeftButtonUp"
SelectedIndex="0"
SelectionChanged="cmbTaobao_SelectionChanged"
Style="{StaticResource RoundedComboBox}">
<ComboBox.ItemTemplate>
<DataTemplate>
<!--<Grid HorizontalAlignment="Stretch" MinWidth="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}">-->
<Grid
Height="auto"
MinWidth="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}, Path=ActualWidth, Converter={StaticResource ValueMinus24Converter}}"
HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<TextBlock
x:Name="tbName"
VerticalAlignment="Center"
Text="{Binding buyer_nick}" />
<userctrls:UcImageButton
x:Name="btnDeleteItem"
Grid.Column="0"
Width="15"
Height="15"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Background="Transparent"
BorderThickness="0"
ButtonImage="{StaticResource imgCloseGray}"
Click="btnDeleteTaobaoItem_Click"
Cursor="Hand"
MouseOverButtonImage="{StaticResource imgCloseGray}"
MousePressButtonImage="{StaticResource imgCloseGray}"
Tag="{Binding ElementName=tbName, Path=Text}"
Visibility="Collapsed" />
<TextBlock
x:Name="tbStatus"
Grid.Column="2"
VerticalAlignment="Center"
Foreground="{Binding status, Converter={StaticResource statusToColorBrushConverter}}"
Text="{Binding status}" />
</Grid>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="btnDeleteItem" Property="Visibility" Value="Visible" />
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<!--<TextBlock Text="选择买手" Grid.Column="12" Margin="12,0,0,0" VerticalAlignment="Center" IsHitTestVisible="False" Foreground="LightGray"
Visibility="{Binding ElementName=cmbBuyer,Path=Text,Converter={StaticResource NotHasTextVisibility}}"></TextBlock>-->
<Button
x:Name="btnLoginTaobao"
Grid.Column="2"
Width="56"
Height="24"
Margin="4,0,0,0"
Click="btnLoginTaobao_Click"
Content="淘宝登录"
Style="{StaticResource BasePageButtonStyle}" />
</WrapPanel>
</wpf:SpacingStackPanel>
<Button
x:Name="btnSwitch"
Grid.Column="2"
Width="24"
Height="24"
Margin="4,0,0,0"
c:DebugVisibility.Enable="True"
d:Visibility="Visible"
Click="btnSwitch_Click"
Style="{StaticResource BasePageButtonStyle}"
Visibility="Collapsed">
<TextBlock
Grid.Column="2"
Margin="0,0,0,1"
d:Visibility="Visible"
FontSize="18"
Foreground="{StaticResource mainColorLightBrush}"
IsHitTestVisible="False"
Style="{StaticResource TextBlockIcon}"
Text="{StaticResource txt-arrow_sync_circle}" />
</Button>
<!-- Text="{StaticResource txt-arrow_clockwise}" -->
<!--<Image
x:Name="切换"
Grid.Column="2"
Width="24"
Height="24"
Margin="4,0,0,0"
c:DebugVisibility.Enable="True"
Cursor="Hand"
Source="{StaticResource imgBuyerOrder}" />-->
</Grid>
</UserControl>
@@ -1,4 +1,7 @@
using _29WxOrderWpf.BaseWindows;
using _29WxOrderWpf.Ctrls.OrderCtrls;
using _29WxOrderWpf.ViewModels;
using _29WxOrderWpf.Views;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
@@ -21,149 +24,370 @@ using System.Windows.Shapes;
using TemuKJD.ToolForms;
using Work;
using Work.BaseForms;
using WxOrder.Framework.Commons;
namespace _29WxOrderWpf.Ctrls.BuyerCtrls
{
/// <summary>
/// PDDBuyerSelectCtrl.xaml 的交互逻辑
/// </summary>
public partial class PDDBuyerSelectCtrl : UserControl
{
public PDDBuyerSelectCtrl()
{
InitializeComponent();
}
/// <summary>
/// PDDBuyerSelectCtrl.xaml 的交互逻辑
/// </summary>
public partial class PDDBuyerSelectCtrl : UserControl
{
public PDDBuyerSelectCtrl()
{
InitializeComponent();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
cmbPddBuyer.ItemsSource = GlobalConfig.PDDBuyerLoginList;
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
cmbPddBuyer.ItemsSource = GlobalConfig.PDDBuyerLoginList;
cmbTaobaoBuyer.ItemsSource = GlobalConfig.TaobaoBuyerLoginList;
}
private void btnLoginPdd_Click(object sender, RoutedEventArgs e)
{
BuyerLoginInfo buyer = null;
if (cmbPddBuyer.SelectedItem != null)
{
buyer = cmbPddBuyer.SelectedItem as BuyerLoginInfo;
}
private void btnLoginPdd_Click(object sender, RoutedEventArgs e)
{
BuyerLoginInfo buyer = null;
if (cmbPddBuyer.SelectedItem != null)
{
buyer = cmbPddBuyer.SelectedItem as BuyerLoginInfo;
}
PddMobileLoginForm pddBuyerForm = new PddMobileLoginForm(buyer);
pddBuyerForm.openType = EnumOpenType.login;
pddBuyerForm.InitUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html";
pddBuyerForm.ShowDialog();
MainWindow.Instance.GetPddBuyer();
}
PddMobileLoginView pddBuyerForm = new PddMobileLoginView(buyer);
pddBuyerForm.ViewModel.OpenType = EnumOpenType.login;
pddBuyerForm.ViewModel.InitUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html";
//pddBuyerForm.ShowDialog();
new DialogWindow()
{
Title = "买手登录",
Content = pddBuyerForm,
}.ShowDialog();
private void cmbPddBuyer_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (e.GetPosition(sender as IInputElement).X > cmbPddBuyer.ActualWidth - 18)
return;
BuyerLoginInfo buyer = null;
if (cmbPddBuyer.SelectedItem != null)
{
buyer = cmbPddBuyer.SelectedItem as BuyerLoginInfo;
}
if (buyer == null)
return;
PddMobileLoginForm.CheckBuyerLogin(new List<BuyerLoginInfo> { buyer }, false);
if (buyer.status == "在线")
{
PddMobileLoginForm shopLoginForm = new PddMobileLoginForm(buyer);
shopLoginForm.openType = EnumOpenType.manage;
//shopLoginForm.WindowState = FormWindowState.Maximized;
shopLoginForm.InitUrl = "https://mobile.yangkeduo.com";
shopLoginForm.Show();
}
else
{
PddMobileLoginForm shopLoginForm = new PddMobileLoginForm(buyer);
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.InitUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html";
shopLoginForm.ShowDialog();
MainWindow.Instance.GetPddBuyer();
}
}
private void cmbPddBuyer_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
BuyerLoginInfo buyer = null;
if (cmbPddBuyer.SelectedItem != null)
{
buyer = cmbPddBuyer.SelectedItem as BuyerLoginInfo;
}
GlobalConfig.CurrentPddBuyer = buyer;
}
private void btnDeleteItem_Click(object sender, RoutedEventArgs e)
{
if (BaseMsgWindow.ShowConfirm("确定删除吗?删除后不可恢复!").DialogResult != true)
return;
if (sender is Button btn)
{
if (btn.DataContext is BuyerLoginInfo buyer)
{
Task.Run(() =>
{
var url = BaseClass.Build29PDDObjString("user/del_buyer");
var data = UserLogin.GetSignaturex()
+ "&buyer_id=" + buyer.buyer_id;
var result = GetHtml.PostUtf8(url, data);
if (result.Contains("\"code\":200"))
{
Dispatcher.Invoke(new Action(() =>
{
GlobalConfig.PDDBuyerLoginList.Remove(buyer);
this.cmbPddBuyer.SelectedIndex = 0;
}));
}
});
}
}
//var pddBuyer =
//var ids = dgvBuyer.Rows.Cast<DataGridViewRow>().Where(r => r.Cells["colSelect"].Value.ParseToBool() == true).Select(s => s.Cells["colBuyerId"].Value.ParseToString()).ToList();
//var buyers = GlobalConfig.PDDBuyerLoginList.Where(b => ids.Contains(b.buyer_id)).ToList();
//this.statusBar.pgbTaskProgress.Maximum = buyers.Count;
//pbLoading.Visible = true;
//Task.Run(() =>
//{
// int i = 0;
// foreach (var buyer in buyers)
// {
// i++;
// this.Invoke(new Action(() =>
// {
// this.statusBar.lblTaskStatus.Text = "正在删除...";
// this.statusBar.pgbTaskProgress.Value = i;
// this.statusBar.pgbTaskProgress.Text = i + "/" + buyers.Count;
// }));
MainWindow.Instance.GetPddBuyer();
//PddMobileLoginForm pddBuyerForm = new PddMobileLoginForm(buyer);
//pddBuyerForm.openType = TemuKJD.ToolForms.EnumOpenType.login;
//pddBuyerForm.InitUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html";
//pddBuyerForm.ShowDialog();
//MainWindow.Instance.GetPddBuyer();
}
// Thread.Sleep(100);
// }
// this.Invoke(new Action(() =>
// {
// this.statusBar.lblTaskStatus.Text = "删除完成";
// this.statusBar.pgbTaskProgress.Value = buyers.Count;
// this.statusBar.pgbTaskProgress.Text = buyers.Count + "/" + buyers.Count;
// }));
// GetPddBuyer();
//});
}
private void cmbPddBuyer_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (e.GetPosition(sender as IInputElement).X > cmbPddBuyer.ActualWidth - 18)
return;
private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (MainWindow.Instance.gridPddBuyerOrderReadCtrl.Visibility != Visibility.Visible)
MainWindow.Instance.gridPddBuyerOrderReadCtrl.Visibility = Visibility.Visible;
if (Panel.GetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl) < 1)
Panel.SetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl, 1);
else
Panel.SetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl, -1);
}
}
BuyerLoginInfo buyer = null;
if (cmbPddBuyer.SelectedItem != null)
{
buyer = cmbPddBuyer.SelectedItem as BuyerLoginInfo;
}
if (buyer == null)
return;
bool islogin = false;
PddMobileLoginViewModel.CheckBuyerLogin(new List<BuyerLoginInfo> { buyer }, false);
PddMobileLoginView shopLoginForm = new PddMobileLoginView(buyer);
if (buyer.status == "在线")
{
shopLoginForm.ViewModel.OpenType = EnumOpenType.manage;
shopLoginForm.ViewModel.InitUrl = "https://mobile.yangkeduo.com";
//shopLoginForm.Show();
}
else
{
shopLoginForm.ViewModel.OpenType = EnumOpenType.login;
shopLoginForm.ViewModel.InitUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html";
//shopLoginForm.ShowDialog();
islogin = true;
}
new DialogWindow()
{
Title = "买手登录",
Content = shopLoginForm,
}.ShowDialog();
if (islogin)
MainWindow.Instance.GetPddBuyer();
}
private void cmbPddBuyer_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
BuyerLoginInfo buyer = null;
if (cmbPddBuyer.SelectedItem != null)
{
buyer = cmbPddBuyer.SelectedItem as BuyerLoginInfo;
}
GlobalConfig.CurrentPddBuyer = buyer;
}
private void btnDeleteItem_Click(object sender, RoutedEventArgs e)
{
if (BaseMsgWindow.ShowConfirm("确定删除吗?删除后不可恢复!").DialogResult != true)
return;
if (sender is Button btn)
{
if (btn.DataContext is BuyerLoginInfo buyer)
{
Task.Run(() =>
{
var url = BaseClass.Build29PDDObjString("user/del_buyer");
var data = UserLogin.GetSignaturex()
+ "&buyer_id=" + buyer.buyer_id;
var result = GetHtml.PostUtf8(url, data);
if (result.Contains("\"code\":200"))
{
Dispatcher.Invoke(new Action(() =>
{
GlobalConfig.PDDBuyerLoginList.Remove(buyer);
this.cmbPddBuyer.SelectedIndex = 0;
}));
}
});
}
}
}
int buyZIndex = 2;
private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility != Visibility.Visible)
MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
if (Panel.GetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl) < 1)
Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, 1);
else
Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, -1);
Panel.SetZIndex(MainWindow.Instance.pddBuyerOrderReadCtrl, buyZIndex++);
MainWindow.Instance.pddBuyerOrderReadCtrl.Visibility = Visibility.Visible;
MainWindow.Instance.tbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
//if (/*wpPddBuyer.Visibility == Visibility.Visible*/ chkPddBuyerLogin.IsChecked == true)
//{
// if (MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility != Visibility.Visible)
// MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
// if (Panel.GetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl) < 1)
// Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, 1);
// else
// Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, -1);
// Panel.SetZIndex(MainWindow.Instance.pddBuyerOrderReadCtrl, buyZIndex++);
// MainWindow.Instance.pddBuyerOrderReadCtrl.Visibility = Visibility.Visible;
// MainWindow.Instance.tbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
//}
//else if (/*wpTaobaoBuyer.Visibility == Visibility.Visible*/ chkTbBuyerLogin.IsChecked == true)
//{
// if (MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility != Visibility.Visible)
// MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
// if (Panel.GetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl) < 1)
// Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, 1);
// else
// Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, -1);
// Panel.SetZIndex(MainWindow.Instance.tbBuyerOrderReadCtrl, buyZIndex++);
// MainWindow.Instance.pddBuyerOrderReadCtrl.Visibility = Visibility.Visible;
// MainWindow.Instance.tbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
//}
//else
//{
// Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, -1);
//}
}
private void btnSwitch_Click(object sender, RoutedEventArgs e)
{
if (wpPddBuyer.Visibility == Visibility.Visible)
{
wpPddBuyer.Visibility = Visibility.Collapsed;
wpTaobaoBuyer.Visibility = Visibility.Visible;
GlobalConfig.CurrentBuyPlatform = "tb";
foreach (var order in GlobalConfig.lstOrder)
{
//OrderListCtrl.InitOrderObservableProp(order);
foreach (var orderItem in order.orderItems)
{
orderItem.UpdateOrderItemBuyButton();
}
}
}
else
{
wpPddBuyer.Visibility = Visibility.Visible;
wpTaobaoBuyer.Visibility = Visibility.Collapsed;
GlobalConfig.CurrentBuyPlatform = "pdd";
foreach (var order in GlobalConfig.lstOrder)
{
//OrderListCtrl.InitOrderObservableProp(order);
foreach (var orderItem in order.orderItems)
{
orderItem.UpdateOrderItemBuyButton();
}
}
}
}
private void btnLoginTaobao_Click(object sender, RoutedEventArgs e)
{
BuyerLoginInfo buyer = null;
if (cmbTaobaoBuyer.SelectedItem != null)
{
buyer = cmbTaobaoBuyer.SelectedItem as BuyerLoginInfo;
}
TaobaoLoginView taobaoBuyerForm = new TaobaoLoginView(buyer);
taobaoBuyerForm.ViewModel.OpenType = EnumOpenType.login;
taobaoBuyerForm.ViewModel.InitUrl = "https://login.taobao.com/havanaone/login/login.htm";
new DialogWindow()
{
Title = "淘宝买手登录",
Content = taobaoBuyerForm,
}.ShowDialog();
MainWindow.Instance.GetTaobaoBuyer();
}
private void cmbTaobao_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
BuyerLoginInfo buyer = null;
if (cmbTaobaoBuyer.SelectedItem != null)
{
buyer = cmbTaobaoBuyer.SelectedItem as BuyerLoginInfo;
}
GlobalConfig.CurrentTaobaoBuyer = buyer;
}
private void cmbTaobao_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (e.GetPosition(sender as IInputElement).X > cmbTaobaoBuyer.ActualWidth - 18)
return;
BuyerLoginInfo buyer = null;
if (cmbTaobaoBuyer.SelectedItem != null)
{
buyer = cmbTaobaoBuyer.SelectedItem as BuyerLoginInfo;
}
if (buyer == null)
return;
bool islogin = false;
//TaobaoBuyOrderViewModel.CheckBuyerLogin(new List<BuyerLoginInfo> { buyer }, false);
TaobaoLoginView buyerLoginForm = new TaobaoLoginView(buyer);
if (buyer.status == "在线")
{
buyerLoginForm.ViewModel.OpenType = EnumOpenType.manage;
buyerLoginForm.ViewModel.InitUrl = "https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?";
new DialogWindow()
{
Width = 1280,
Height = 800,
Title = "买手主页",
Content = buyerLoginForm,
}.Show();
}
else
{
buyerLoginForm.ViewModel.OpenType = EnumOpenType.login;
buyerLoginForm.ViewModel.InitUrl = "https://login.taobao.com/havanaone/login/login.htm";
new DialogWindow()
{
Width = 1280,
Height = 800,
Title = "买手登录",
Content = buyerLoginForm,
}.ShowDialog();
}
if (islogin)
MainWindow.Instance.GetTaobaoBuyer();
}
private void btnDeleteTaobaoItem_Click(object sender, RoutedEventArgs e)
{
if (BaseMsgWindow.ShowConfirm("确定删除吗?删除后不可恢复!").DialogResult != true)
return;
if (sender is Button btn)
{
if (btn.DataContext is BuyerLoginInfo buyer)
{
Task.Run(() =>
{
var url = BaseClass.Build29WxObjString("user/del_taobao_buyer");
var data = UserLogin.GetSignaturex()
+ "&buyer_id=" + buyer.buyer_id;
var result = GetHtml.PostUtf8(url, data);
if (result.Contains("\"code\":200"))
{
Dispatcher.Invoke(new Action(() =>
{
GlobalConfig.TaobaoBuyerLoginList.Remove(buyer);
this.cmbPddBuyer.SelectedIndex = 0;
}));
}
});
}
}
}
private async void chkBuyerLogin_Click(object sender, RoutedEventArgs e)
{
if (sender == chkPddBuyerLogin)
{
chkPddBuyerLogin.IsChecked = true;
chkTbBuyerLogin.IsChecked = false;
GlobalConfig.CurrentBuyPlatform = "pdd";
foreach (var order in GlobalConfig.lstOrder)
{
//OrderListCtrl.InitOrderObservableProp(order);
foreach (var orderItem in order.orderItems)
{
await Task.Run(() =>
{
orderItem.UpdateOrderItemBuyButton();
orderItem.SetAbnormalAndDirectBtnVisibility();
});
}
}
}
else
{
chkPddBuyerLogin.IsChecked = false;
chkTbBuyerLogin.IsChecked = true;
GlobalConfig.CurrentBuyPlatform = "tb";
foreach (var order in GlobalConfig.lstOrder)
{
//OrderListCtrl.InitOrderObservableProp(order);
foreach (var orderItem in order.orderItems)
{
await Task.Run(() =>
{
orderItem.UpdateOrderItemBuyButton();
orderItem.SetAbnormalAndDirectBtnVisibility();
});
}
}
}
}
private void imgTb_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility != Visibility.Visible)
MainWindow.Instance.gridTbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
if (Panel.GetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl) < 1)
Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, 1);
else
Panel.SetZIndex(MainWindow.Instance.gridTbBuyerOrderReadCtrl, -1);
Panel.SetZIndex(MainWindow.Instance.tbBuyerOrderReadCtrl, buyZIndex++);
MainWindow.Instance.pddBuyerOrderReadCtrl.Visibility = Visibility.Visible;
MainWindow.Instance.tbBuyerOrderReadCtrl.Visibility = Visibility.Visible;
}
}
}
@@ -0,0 +1,735 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.PDDMultiBuyerOrderReadCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="pddMultiBuyerOrderReadCtrl"
d:DesignHeight="450"
d:DesignWidth="1000"
Loaded="UserControl_Loaded"
mc:Ignorable="d">
<Border
Background="White"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1,1,0,1"
CornerRadius="5,0,0,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button
x:Name="btnHideAll"
Grid.Row="1"
Width="25"
Height="60"
Margin="-20,0,0,20"
HorizontalAlignment="left"
Click="btnHideAll_Click"
Style="{StaticResource BasePageButtonStyle}">
<TextBlock Margin="0,0,5,0">
关<LineBreak />
闭</TextBlock>
</Button>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Image
Width="16"
Height="16"
Margin="12,0,4,0"
Cursor="Hand"
MouseLeftButtonUp="btnHideAll_Click"
Source="{StaticResource imgCloseGray}"
Visibility="Collapsed" />
<WrapPanel Grid.Column="1" VerticalAlignment="Center">
<CheckBox
x:Name="chkAutoReadBuyerOrder"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkAutoReadBuyerOrder_CheckedChanged"
Content="自动读多多买手单"
FontSize="12"
IsChecked="true"
Unchecked="chkAutoReadBuyerOrder_CheckedChanged" />
<CheckBox
x:Name="chkHideNoWxIdOrder"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkHideNoWxIdOrder_CheckedChanged"
Content="隐藏无微信订单的买手单"
FontSize="12"
IsChecked="True"
Unchecked="chkHideNoWxIdOrder_CheckedChanged" />
<CheckBox
x:Name="chkAutoAfterSale"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkAutoAfterSale_Checked"
Content="未发货订单自动售后"
FontSize="12"
IsChecked="True"
Unchecked="chkAutoAfterSale_Checked"
Visibility="Visible" />
<Button
x:Name="btnSearch"
Grid.Column="8"
Width="118"
Height="24"
Margin="4,0,0,0"
Click="btnSearch_Click"
Content="刷新订单"
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnNextBuyer"
Grid.Column="8"
Height="24"
Margin="4,0,0,0"
Padding="4,0"
Click="btnNextBuyer_Click"
Content="下一个买手"
Style="{StaticResource BasePageButtonStyle}" />
</WrapPanel>
<TextBox
x:Name="txtFilter"
Grid.Column="2"
Height="28"
Margin="28,0,8,0"
VerticalContentAlignment="Center"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
TextChanged="txtFilter_TextChanged" />
<Button
x:Name="btnFilter"
Grid.Column="3"
Width="50"
Height="24"
Margin="4,0,8,0"
Click="btnFilter_Click"
Content="过滤"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
<Grid
x:Name="GridCef"
Grid.Row="1"
Background="LightGray" />
<Grid
Grid.Row="1"
Margin="2,2,0,334"
HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Border
x:Name="borderPddBuyer"
Width="138"
Background="White"
CornerRadius="0,4,4,0">
<Grid>
<ListBox x:Name="lbPddBuyer">
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!--<local:ShopListRowCtrl></local:ShopListRowCtrl>-->
<Border
MinHeight="50"
Margin="0,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
BorderBrush="{StaticResource ListRowBorderColorBrush}"
BorderThickness="0,0,0,1"
CornerRadius="0">
<Border.Style>
<!-- 鼠标进入或悬停Border时切换颜色(悬停时Border的填充控件必须有填充Border,所在层级不限,仅填充透明Grid则触发器无效) -->
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource ListRowHoverBackColorBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid x:Name="gridListItem">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="colCheck" Width="25*" />
<ColumnDefinition x:Name="colBuyerName" Width="100*" />
</Grid.ColumnDefinitions>
<CheckBox
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
Click="CheckBox_Click"
IsChecked="{Binding IsSelect, Mode=TwoWay}" />
<TextBox
x:Name="txtBuyerNick"
Grid.Column="1"
HorizontalContentAlignment="Left"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
Cursor="Hand"
IsReadOnly="True"
Loaded="txtBuyerNick_Loaded"
Text="{Binding buyer_nick}"
TextWrapping="Wrap" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Border>
<Border
Grid.Column="1"
Height="60"
Margin="-2,0,0,0"
VerticalAlignment="Center"
Panel.ZIndex="-1"
Background="{StaticResource pageColorBrush}"
CornerRadius="0,5,5,0"
Cursor="Hand">
<Button
x:Name="btnHideBuyer"
Grid.Column="1"
Width="20"
Height="60"
Margin="0,0,0,0"
Padding="0,0,0,0"
VerticalContentAlignment="Center"
Click="btnHideBuyer_Click"
Content="◀"
Style="{StaticResource BasePageButtonStyle}" />
</Border>
</Grid>
<Grid
Grid.Row="1"
Margin="0"
VerticalAlignment="Bottom"
Background="Transparent"
Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button
x:Name="btnHide"
Width="60"
Height="25"
Margin="0,0,0,-10"
Padding="0,2,0,0"
VerticalContentAlignment="top"
Click="btnHide_Click"
Content="▼"
Style="{StaticResource BasePageButtonStyle}" />
<Grid
x:Name="gridTable"
Grid.Row="1"
Height="330"
Margin="2"
VerticalAlignment="Bottom"
Background="White"
Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label
x:Name="lblMsg"
Margin="180,0,0,0"
VerticalAlignment="Center"
Panel.ZIndex="1"
Content="正在操作:" />
<TabControl
x:Name="tabOrderType"
Grid.Row="1"
Margin="0,-32,0,1"
VerticalAlignment="Stretch">
<TabControl.Resources>
<Style TargetType="{x:Type TabControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border
Grid.Row="1"
MinHeight="4"
Background="#f8f8f9"
BorderBrush="#e0e0e0"
BorderThickness="1,1,1,0"
CornerRadius="0,4,0,0">
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" />
</Border>
<Border
Margin="0,0,0,0"
HorizontalAlignment="Left"
Background="#e8e8e9"
BorderBrush="#e1e1e1"
BorderThickness="1,1,1,0"
CornerRadius="4,4,0,0">
<TabPanel
x:Name="HeaderPanel"
Background="Transparent"
IsItemsHost="True" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TabItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border
Name="Border"
Margin="-1,-2,-1,0"
BorderThickness="1,1,1,0"
CornerRadius="4,4,0,0">
<ContentPresenter
x:Name="ContentSite"
Margin="10,5"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ContentSource="Header" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="#f8f8f9" />
<Setter TargetName="Border" Property="BorderBrush" Value="#e0e0e0" />
<Setter TargetName="Border" Property="Margin" Value="-1,-3,-1,-1" />
<Setter Property="Foreground" Value="{StaticResource pageColorBrush}" />
<Setter Property="Panel.ZIndex" Value="100" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="#999999" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<TabItem Header="买手订单">
<DataGrid
x:Name="dgBuyerOrder"
Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ColumnHeaderHeight="30"
HorizontalGridLinesBrush="{StaticResource HorizontalGridLinesBrush}"
LoadingRow="dgBuyerOrder_LoadingRow"
RowHeaderWidth="0"
RowHeight="50"
SelectionChanged="dgBuyerOrder_SelectionChanged"
VerticalGridLinesBrush="{StaticResource VerticalGridLinesBrush}">
<DataGrid.Columns>
<DataGridTextColumn
Width="40"
Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
CanUserSort="False"
Header="序列"
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.6*"
Binding="{Binding WxSendTypeStr}"
Header="是否直发">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding order_sn}"
Header="拍单订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding ShopOrderIdStr}"
Header="店铺订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding buyerName}"
Header="买手名称">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding OrderTimeStr}"
Header="拍单时间">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.8*"
Binding="{Binding ProdInfoStr}"
Header="商品信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding AmoutValue}"
Header="金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding order_status_prompt}"
Header="订单状态">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding outExpressCompanyCode}"
Header="物流名称">
<!-- outExpressCompanyName -->
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding tracking_number}"
Header="物流单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding sendStatus}"
Header="订单信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn
x:Name="colSendBuyerOrder"
Width="0.6*"
Header="手动发送">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button
x:Name="btnSendBuyerOrder"
Grid.Row="2"
Grid.Column="1"
Margin="4,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="Transparent"
Click="btnSendBuyerOrder_Click"
Content="发送"
Foreground="{StaticResource PageLinkBrush}"
Visibility="{Binding TransitWarehouseIdStr, Converter={StaticResource HasTextVisibility}}" />
<Button
x:Name="btnSendDirectBuyerOrder"
Grid.Row="2"
Grid.Column="1"
Margin="4,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="Transparent"
Click="btnSendBuyerOrder_Click"
Content="发送"
Foreground="{StaticResource PageLinkBrush}"
Visibility="{Binding WxSendTypeStr, Converter={StaticResource HasTextVisibility}}" />
<!-- 直发单直发标注不为空 -->
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem Header="买手售后">
<DataGrid
x:Name="dgBuyerAfterSale"
Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ColumnHeaderHeight="30"
HorizontalGridLinesBrush="{StaticResource HorizontalGridLinesBrush}"
LoadingRow="dgBuyerOrder_LoadingRow"
RowHeaderWidth="0"
RowHeight="50"
VerticalGridLinesBrush="{StaticResource VerticalGridLinesBrush}">
<DataGrid.Columns>
<DataGridTextColumn
Width="40"
Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
CanUserSort="False"
Header="序列"
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.6*"
Binding="{Binding WxSendTypeStr}"
Header="是否直发">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding afterSalesId}"
Header="售后单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding orderSn}"
Header="拍单订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding ShopOrderIdStr}"
Header="店铺订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding buyerName}"
Header="买手名称">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding orderDate}"
Header="拍单日期">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.8*"
Binding="{Binding ProdInfoStr}"
Header="商品信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding OrderAmountValue}"
Header="订单金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding RefundAmountValue}"
Header="售后金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding AfterSaleStatusStr}"
Header="售后状态">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding sendStatus}"
Header="订单信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!--<DataGridTemplateColumn Width="0.6*" Header="手动发送" x:Name="colSendBuyerOrderAfterSale" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Grid.Column="1" Grid.Row="2" x:Name="btnSendBuyerOrder" VerticalAlignment="Center" Background="Transparent" HorizontalAlignment="Center"
Foreground="{StaticResource PageLinkBrush}" BorderBrush="Transparent" Margin="4,0,0,0" Content="发送" Click="btnSendBuyerOrder_Click"
Visibility="{Binding TransitWarehouseIdStr, Converter={StaticResource HasTextVisibility}}"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>-->
</DataGrid.Columns>
</DataGrid>
</TabItem>
</TabControl>
</Grid>
</Grid>
</Grid>
</Border>
</UserControl>
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,598 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.PddBuyOrderCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:uc="clr-namespace:_29WxOrderWpf.UserControls"
xmlns:wpf="WPFCommon"
x:Name="pddBuyOrderCtrl"
Width="1360"
Height="768"
MinWidth="800"
MinHeight="600"
d:Height="800"
Loaded="pddBuyOrderCtrl_Loaded"
mc:Ignorable="d">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
<Style BasedOn="{StaticResource TitleContentBaseStyle}" TargetType="wpf:TitleContent">
<Setter Property="Placement" Value="Left" />
<Setter Property="TitleVerticalAlignment" Value="Center" />
<Setter Property="LeftTitlePadding" Value="0,0,0,0" />
</Style>
<Style TargetType="wpf:SpacingStackPanel">
<Setter Property="Margin" Value="3,0" />
</Style>
</UserControl.Resources>
<Grid Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="28" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- 地址栏 -->
<Border
Grid.Row="0"
Background="White"
BorderBrush="#E0E0E0"
BorderThickness="0,0,0,1">
<TextBox
x:Name="txtAddress"
Margin="3,2"
VerticalContentAlignment="Center"
BorderBrush="#D0D0D0"
BorderThickness="1"
KeyDown="txtAddress_KeyDown"
Text="{Binding Address, UpdateSourceTrigger=PropertyChanged}" />
</Border>
<!-- 主区域:浏览器 -->
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="500" />
</Grid.ColumnDefinitions>
<!-- 浏览器容器 -->
<Grid
x:Name="BrowserHost"
Grid.Column="0"
Background="White"
ClipToBounds="True">
<TextBlock
Margin="0,-140,0,0"
Padding="30,20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Panel.ZIndex="99"
d:Text="ErrorMsg"
Background="#C0FFFFFF"
FontSize="20"
Foreground="Red"
IsHitTestVisible="False"
Text="{Binding ErrorMsg}"
TextWrapping="Wrap"
Visibility="{Binding ErrorMsg, Converter={StaticResource HasTextVisibility}}" />
<TextBlock
Margin="0,0,0,0"
Padding="30,20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Panel.ZIndex="99"
d:Text="TransitErrorMsg"
Background="#C0FFFFFF"
FontSize="20"
Foreground="Red"
IsHitTestVisible="False"
Text="{Binding TransitErrorMsg}"
TextWrapping="Wrap"
Visibility="{Binding TransitErrorMsg, Converter={StaticResource HasTextVisibility}}" />
</Grid>
<GridSplitter
Grid.Column="1"
Width="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#d0d0d0"
ResizeBehavior="PreviousAndNext"
ShowsPreview="True" />
<Grid Grid.Column="2">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<wpf:SpacingStackPanel
Grid.Row="0"
Margin="4"
Orientation="Vertical"
VerticalSpacing="4">
<Grid>
<Image
x:Name="imgOrderItem"
Grid.Row="1"
Grid.Column="0"
Width="100"
Height="100"
Margin="0,4,8,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Panel.ZIndex="1"
Cursor="Hand"
MouseDown="imgOrderItem_MouseDown"
Source="{Binding Img}" />
<wpf:SpacingStackPanel
Width="250"
Margin="4"
HorizontalAlignment="Right"
Orientation="Vertical"
VerticalSpacing="4">
<CheckBox
x:Name="chkDirectOrder"
Margin="0,0,0,8"
d:IsChecked="True"
BorderBrush="{StaticResource mainColorBrush}"
Content="保存地址时替换为云仓地址"
FontSize="12" />
<wpf:TitleContent
Title="店铺名称:"
HorizontalAlignment="Right"
VerticalAlignment="Top"
TitleHorizontalAlignment="Right"
TitleWidth="85">
<TextBox
x:Name="txtShopName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="订单编号:"
HorizontalAlignment="Right"
VerticalAlignment="Top"
TitleHorizontalAlignment="Right"
TitleWidth="85">
<TextBox
x:Name="txtOrderId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtOrderIdVal}" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
</Grid>
<TextBlock FontSize="14" FontWeight="Bold">店铺商品信息:</TextBlock>
<wpf:TitleContent
x:Name="tcShopGoodsName"
Title="店铺标题:"
TitleHorizontalAlignment="Right"
TitleWidth="85">
<TextBox
x:Name="txtShopGoodsName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopGoodsNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="店铺规格:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopSpecName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopSpecNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="店铺商品ID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopGoodsId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopGoodsIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="店铺SKUID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopSkuId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopSkuIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="平台商品编码:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtSpuCode"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSpuCodeVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="平台SKU编码:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtSkuCode"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSkuCodeVal}" />
</wpf:TitleContent>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.04*" />
<ColumnDefinition Width="0.96*" />
</Grid.ColumnDefinitions>
<wpf:TitleContent
Title="数量:"
Grid.Column="0"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopOrderItemCnt"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopOrderItemCntVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="  总价:"
Grid.Column="1"
Margin="10,0,0,0"
TitleHorizontalAlignment="Right">
<TextBox
x:Name="txtShopOrderItemPrice"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopOrderItemPriceVal}" />
</wpf:TitleContent>
</Grid>
<wpf:SpacingStackPanel
Grid.Row="0"
Margin="0"
Orientation="Vertical"
VerticalSpacing="4"
Visibility="{Binding BuyInfoVisivility}">
<TextBlock
Margin="0,4,0,0"
FontSize="14"
FontWeight="Bold">
买手拍单信息:
</TextBlock>
<wpf:TitleContent
Title="商品标题:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyGoodsName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyGoodsNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="规格名称:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuySkuName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuySkuNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="拍单商品ID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyGoodsId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyGoodsIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="拍单SKUID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuySkuId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuySkuIdVal}" />
</wpf:TitleContent>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.04*" />
<ColumnDefinition Width="0.96*" />
</Grid.ColumnDefinitions>
<wpf:TitleContent
Title="拍单数量:"
Grid.Column="0"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyCnt"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyCntVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="拍单总价:"
Grid.Column="1"
Margin="10,0,0,0"
TitleHorizontalAlignment="Right">
<TextBox
x:Name="txtBuyPrice"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyPriceVal}" />
</wpf:TitleContent>
</Grid>
<wpf:TitleContent
Title="拍单订单号:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyOrderId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyOrderIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="溯源码:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtSourceCode"
Height="20"
Background="#DDDDDD"
BorderBrush="#999999"
IsEnabled="False"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSourceCodeVal}" />
</wpf:TitleContent>
<wpf:TitleContent
x:Name="tcBuyAddress"
Title="中转地址:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyTransitWarehouse"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyTransitWarehouseVal}" />
</wpf:TitleContent>
<Grid>
<Button
x:Name="btnReMap"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="0"
Padding="4,0"
HorizontalAlignment="Left"
Command="{Binding ReMapCommand}"
Content="重新关联商品"
FontSize="12"
Style="{StaticResource BasePageButtonLightStyle}" />
<Button
x:Name="btnCopyCurrentFullAddress"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="85,0,0,0"
Padding="4,0"
HorizontalAlignment="Left"
Command="{Binding CopyCurrentFullAddressCommand}"
Content="复制完整中转地址"
FontSize="12"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="{Binding CurrentFullTransitAddress, Converter={StaticResource HasTextVisibility}}" />
<Button
x:Name="btnManualUpdateBuyOrder"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="0"
Padding="4,0"
HorizontalAlignment="Right"
Command="{Binding ManualUpdateBuyOrderCommand}"
Content="手动确认拍单"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
</wpf:SpacingStackPanel>
</wpf:SpacingStackPanel>
<wpf:SpacingStackPanel
Grid.Row="2"
Margin="4"
Orientation="Vertical"
VerticalSpacing="4"
Visibility="{Binding MapInfoVisivility}">
<TextBlock
Margin="0,4,0,0"
FontSize="14"
FontWeight="Bold">
关联商品信息:
</TextBlock>
<wpf:TitleContent
Title="商品标题:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapGoodsName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapGoodsNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="规格名称:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapSkuName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapSkuNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="关联商品ID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapGoodsId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapGoodsIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="关联SKUID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapSkuId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapSkuIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="发货地:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<TextBox
x:Name="txtSendProvince"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSendProvinceVal}" />
<Button
x:Name="btnManualUpdateSendProvince"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="3,0,0,0"
Padding="4,0"
HorizontalAlignment="Right"
d:Opacity="0.5"
Content="手动更新发货地"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
</wpf:TitleContent>
<wpf:TitleContent
Title="中转仓:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<ComboBox
x:Name="cmbTransitWarehouse"
Height="22"
SelectedIndex="0"
SelectedValue="{Binding cmbTransitWarehouseVal}"
SelectionChanged="cmbTransitWarehouse_SelectionChanged"
Style="{StaticResource RoundedComboBox}">
<!--<ComboBoxItem Content="仓库地址" />-->
</ComboBox>
</wpf:TitleContent>
<wpf:TitleContent
Title=""
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<Button
x:Name="btnManualUpdateTransitWarehouse"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="0"
Padding="4,0"
HorizontalAlignment="Right"
Command="{Binding UpdateTransitWarehouseCommand}"
Content="确认商品关联"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
</Grid>
</Grid>
</Grid>
</UserControl>
@@ -0,0 +1,95 @@
using _29WxOrderWpf.ViewModels;
using AllBase.Model.DBModel;
using CefSharp.Wpf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace _29WxOrderWpf.Ctrls.BuyerCtrls;
/// <summary>
/// PddBuyOrderCtrl.xaml 的交互逻辑
/// </summary>
public partial class PddBuyOrderCtrl : UserControl
{
/// <summary>视图模型</summary>
public PddBuyOrderViewModel ViewModel { get; }
public PddBuyOrderCtrl(BuyerLoginInfo buyerInfo, oms_wei_order_item_info orderItemInfo)
{
InitializeComponent();
foreach (var warehouse in TransitWarehouseData.TransitWarehouseList)
{
this.cmbTransitWarehouse.Items.Add(warehouse.TransName + " " + warehouse.TransFullAddress);
}
ViewModel = new PddBuyOrderViewModel(buyerInfo, orderItemInfo);
ViewModel.BrowserCreated += ViewModel_BrowserCreated;
ViewModel.RequestClose += ViewModel_RequestClose;
DataContext = ViewModel;
}
private async void pddBuyOrderCtrl_Loaded(object sender, RoutedEventArgs e)
{
//btnManualUpdateSendProvince.Visibility = Visibility.Collapsed;
if (this.ViewModel.BuyType == "direct")
{
this.tcBuyAddress.Title = "拍单地址:";
}
await ViewModel.Start();
}
private void ViewModel_BrowserCreated(ChromiumWebBrowser browser)
{
Grid.SetRow(browser, 0);
Grid.SetColumn(browser, 0);
BrowserHost.Children.Add(browser);
}
private void ViewModel_RequestClose()
{
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
parentWindow.Close();
}
private void txtAddress_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
ViewModel.ReloadCommand.Execute(null);
}
}
private void cmbTransitWarehouse_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void imgOrderItem_MouseDown(object sender, MouseButtonEventArgs e)
{
if (imgOrderItem.Width == 100)
{
imgOrderItem.Width = 500;
imgOrderItem.Height = 500;
}
else
{
imgOrderItem.Width = 100;
imgOrderItem.Height = 100;
}
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,128 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.SkuSelectListRowCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="150"
d:DesignWidth="800"
mc:Ignorable="d">
<Grid>
<Border
Margin="4"
BorderBrush="LightSkyBlue"
BorderThickness="1"
CornerRadius="10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Image
x:Name="imgSku"
Grid.Row="0"
Grid.Column="0"
Width="100"
Height="100"
Margin="8"
VerticalAlignment="Top"
Cursor="Hand"
MouseDown="imgSku_MouseDown"
MouseEnter="imgSku_MouseEnter"
MouseLeave="imgSku_MouseLeave" />
<Grid
Grid.Column="1"
Margin="0,8"
VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<WrapPanel Visibility="{Binding SpecNameStr, Converter={StaticResource HasTextVisibility}}">
<TextBox
VerticalAlignment="Top"
d:Opacity="0.5"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="商品标题:"
TextWrapping="Wrap" />
<TextBox
VerticalAlignment="Top"
d:Opacity="0.5"
d:Text="商品标题"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding GoodsNameStr}"
TextWrapping="Wrap" />
</WrapPanel>
<WrapPanel Grid.Row="1" Visibility="{Binding SpecNameStr, Converter={StaticResource HasTextVisibility}}">
<TextBox
VerticalAlignment="Top"
d:Opacity="0.5"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="商品规格:"
TextWrapping="Wrap" />
<TextBox
Grid.Row="0"
VerticalAlignment="Top"
d:Opacity="0.5"
d:Text="SKU规格"
Background="Transparent"
BorderThickness="0"
FontWeight="Bold"
IsReadOnly="True"
Text="{Binding SpecNameStr}"
TextWrapping="Wrap" />
</WrapPanel>
<WrapPanel Grid.Row="2" Visibility="{Binding groupPrice, Converter={StaticResource HasTextVisibility}}">
<TextBox
VerticalAlignment="Top"
d:Opacity="0.5"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="规格单价:"
TextWrapping="Wrap" />
<TextBox
Grid.Row="0"
VerticalAlignment="Top"
d:Opacity="0.5"
d:Text="0.00"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding groupPrice}"
TextWrapping="Wrap" />
</WrapPanel>
</Grid>
<Button
x:Name="btnAdd"
Grid.Column="100"
MinWidth="48"
MinHeight="28"
Margin="8"
Padding="4"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Click="btnAdd_Click"
Content="确定关联"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
</Border>
</Grid>
</UserControl>
@@ -0,0 +1,81 @@
using _29WxOrderWpf.ViewModels;
using AllBase;
using AllBase.Model.DBModel;
using AllBase.Model.Result;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Work._29Tools.Forms.ToolForms;
namespace _29WxOrderWpf.Ctrls.BuyerCtrls;
/// <summary>
/// SkuSelectListRowCtrl.xaml 的交互逻辑
/// </summary>
public partial class SkuSelectListRowCtrl : UserControl
{
public SkuSelectListRowCtrl()
{
InitializeComponent();
this.DataContextChanged += SkuSelectListRowCtrl_DataContextChanged;
}
private void SkuSelectListRowCtrl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.DataContext is frontSkuInfo3 frontSku)
{
Task.Run(() =>
{
// 异步加载图片防止卡顿
// 缩略图在有的电脑上无法显示
//BitmapImage bImg = ImageUrlToBitmapImageConverter.LoadImageFromUrl(order_item.thumb_img + "?imageView2/1/w/100/format/webp|imageMogr2/auto-orient=");
BitmapImage bImg = AllBase.ImageBuild.LoadBitmipImageFromUrl(frontSku.thumbUrl);
Thread.Sleep(Randomx.GetId(200));
Dispatcher.Invoke(new Action(() =>
{
imgSku.Source = bImg;
}));
});
}
}
private void imgSku_MouseDown(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is frontSkuInfo3 frontSku)
{
ShowImgForm imgFrom = new ShowImgForm(frontSku.thumbUrl);
imgFrom.TopMost = true;
imgFrom.Show();
}
}
private void imgSku_MouseEnter(object sender, MouseEventArgs e)
{
}
private void imgSku_MouseLeave(object sender, MouseEventArgs e)
{
}
private async void btnAdd_Click(object sender, RoutedEventArgs e)
{
if (this.DataContext is frontSkuInfo3 frontSku)
{
await BuyMapSkuViewModel.BuyMapSkuInstance.SetOrderMapSku(frontSku);
}
}
}
@@ -0,0 +1,563 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.TaobaoBuyOrderCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:uc="clr-namespace:_29WxOrderWpf.UserControls"
xmlns:wpf="WPFCommon"
x:Name="taobaoBuyOrderCtrl"
Width="1360"
Height="768"
MinWidth="800"
MinHeight="600"
d:Height="800"
Loaded="taobaoBuyOrderCtrl_Loaded"
mc:Ignorable="d">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
<Style BasedOn="{StaticResource TitleContentBaseStyle}" TargetType="wpf:TitleContent">
<Setter Property="Placement" Value="Left" />
<Setter Property="TitleVerticalAlignment" Value="Center" />
<Setter Property="LeftTitlePadding" Value="0,0,0,0" />
</Style>
<Style TargetType="wpf:SpacingStackPanel">
<Setter Property="Margin" Value="3,0" />
</Style>
</UserControl.Resources>
<Grid Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="28" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- 地址栏 -->
<Border
Grid.Row="0"
Background="White"
BorderBrush="#E0E0E0"
BorderThickness="0,0,0,1">
<TextBox
x:Name="txtAddress"
Margin="3,2"
VerticalContentAlignment="Center"
BorderBrush="#D0D0D0"
BorderThickness="1"
KeyDown="txtAddress_KeyDown"
Text="{Binding Address, UpdateSourceTrigger=PropertyChanged}" />
</Border>
<!-- 主区域:浏览器 -->
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="300" />
</Grid.ColumnDefinitions>
<!-- 浏览器容器 -->
<Grid
x:Name="BrowserHost"
Grid.Column="0"
Background="White"
ClipToBounds="True">
<TextBlock
Margin="0,-140,0,0"
Padding="30,20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Panel.ZIndex="99"
d:Text="ErrorMsg"
Background="#C0FFFFFF"
FontSize="20"
Foreground="Red"
IsHitTestVisible="False"
Text="{Binding ErrorMsg}"
TextWrapping="Wrap"
Visibility="{Binding ErrorMsg, Converter={StaticResource HasTextVisibility}}" />
<TextBlock
Margin="0,0,0,0"
Padding="30,20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Panel.ZIndex="99"
d:Text="TransitErrorMsg"
Background="#C0FFFFFF"
FontSize="20"
Foreground="Red"
IsHitTestVisible="False"
Text="{Binding TransitErrorMsg}"
TextWrapping="Wrap"
Visibility="{Binding TransitErrorMsg, Converter={StaticResource HasTextVisibility}}" />
</Grid>
<GridSplitter
Grid.Column="1"
Width="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#d0d0d0"
ResizeBehavior="PreviousAndNext"
ShowsPreview="True" />
<Grid Grid.Column="2">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<wpf:SpacingStackPanel
Grid.Row="0"
Margin="4"
Orientation="Vertical"
VerticalSpacing="4">
<Image
x:Name="imgOrderItem"
Grid.Row="1"
Grid.Column="0"
Width="100"
Height="100"
Margin="0,2,8,2"
VerticalAlignment="Top"
Cursor="Hand"
MouseDown="imgOrderItem_MouseDown"
Source="{Binding Img}" />
<TextBlock FontSize="14" FontWeight="Bold">店铺商品信息:</TextBlock>
<wpf:TitleContent
x:Name="tcShopGoodsName"
Title="店铺标题:"
TitleHorizontalAlignment="Right"
TitleWidth="85">
<TextBox
x:Name="txtShopGoodsName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopGoodsNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="店铺规格:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopSpecName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopSpecNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="店铺商品ID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopGoodsId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopGoodsIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="店铺SKUID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopSkuId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopSkuIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="平台商品编码:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtSpuCode"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSpuCodeVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="平台SKU编码:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtSkuCode"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSkuCodeVal}" />
</wpf:TitleContent>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.04*" />
<ColumnDefinition Width="0.96*" />
</Grid.ColumnDefinitions>
<wpf:TitleContent
Title="数量:"
Grid.Column="0"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtShopOrderItemCnt"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopOrderItemCntVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="  总价:"
Grid.Column="1"
Margin="10,0,0,0"
TitleHorizontalAlignment="Right">
<TextBox
x:Name="txtShopOrderItemPrice"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtShopOrderItemPriceVal}" />
</wpf:TitleContent>
</Grid>
<wpf:SpacingStackPanel
Grid.Row="0"
Margin="0"
Orientation="Vertical"
VerticalSpacing="4"
Visibility="{Binding BuyInfoVisivility}">
<TextBlock
Margin="0,4,0,0"
FontSize="14"
FontWeight="Bold">
买手拍单信息:
</TextBlock>
<wpf:TitleContent
Title="商品标题:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyGoodsName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyGoodsNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="规格名称:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuySkuName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuySkuNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="拍单商品ID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyGoodsId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyGoodsIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="拍单SKUID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuySkuId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuySkuIdVal}" />
</wpf:TitleContent>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.04*" />
<ColumnDefinition Width="0.96*" />
</Grid.ColumnDefinitions>
<wpf:TitleContent
Title="拍单数量:"
Grid.Column="0"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyCnt"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyCntVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="拍单总价:"
Grid.Column="1"
Margin="10,0,0,0"
TitleHorizontalAlignment="Right">
<TextBox
x:Name="txtBuyPrice"
Height="22"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
FontSize="15"
FontWeight="bold"
Foreground="Red"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyPriceVal}" />
</wpf:TitleContent>
</Grid>
<wpf:TitleContent
Title="拍单订单号:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyOrderId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyOrderIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="溯源码:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtSourceCode"
Height="20"
Background="#DDDDDD"
BorderBrush="#999999"
IsEnabled="False"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSourceCodeVal}" />
</wpf:TitleContent>
<wpf:TitleContent
x:Name="tcBuyAddress"
Title="中转地址:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtBuyTransitWarehouse"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtBuyTransitWarehouseVal}" />
</wpf:TitleContent>
<Grid>
<Button
x:Name="btnReMap"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="0"
Padding="4,0"
HorizontalAlignment="Left"
Command="{Binding ReMapCommand}"
Content="重新关联商品"
FontSize="12"
Style="{StaticResource BasePageButtonLightStyle}" />
<Button
x:Name="btnCopyCurrentFullAddress"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="85,0,0,0"
Padding="4,0"
HorizontalAlignment="Left"
Command="{Binding CopyCurrentFullAddressCommand}"
Content="复制完整中转地址"
FontSize="12"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="{Binding CurrentFullTransitAddress, Converter={StaticResource HasTextVisibility}}" />
<Button
x:Name="btnManualUpdateBuyOrder"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="0"
Padding="4,0"
HorizontalAlignment="Right"
Command="{Binding ManualUpdateBuyOrderCommand}"
Content="手动确认拍单"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
<TextBlock
Width="auto"
Padding="0,3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Panel.ZIndex="99"
Background="#C0FFFFFF"
FontSize="16"
Foreground="#EE0000"
IsHitTestVisible="False"
Text=" 淘宝网页跳转速度较慢,请耐心等待"
TextWrapping="Wrap" />
</wpf:SpacingStackPanel>
</wpf:SpacingStackPanel>
<wpf:SpacingStackPanel
Grid.Row="2"
Margin="4"
Orientation="Vertical"
VerticalSpacing="4"
Visibility="{Binding MapInfoVisivility}">
<TextBlock
Margin="0,4,0,0"
FontSize="14"
FontWeight="Bold">
关联商品信息:
</TextBlock>
<wpf:TitleContent
Title="商品标题:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapGoodsName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapGoodsNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="规格名称:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapSkuName"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapSkuNameVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="关联商品ID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapGoodsId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapGoodsIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="关联SKUID:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<TextBox
x:Name="txtMapSkuId"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtMapSkuIdVal}" />
</wpf:TitleContent>
<wpf:TitleContent
Title="发货地:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<TextBox
x:Name="txtSendProvince"
Height="20"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding txtSendProvinceVal}" />
<Button
x:Name="btnManualUpdateSendProvince"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="3,0,0,0"
Padding="4,0"
HorizontalAlignment="Right"
d:Opacity="0.5"
Content="手动更新发货地"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
</wpf:TitleContent>
<wpf:TitleContent
Title="中转仓:"
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<ComboBox
x:Name="cmbTransitWarehouse"
Height="22"
SelectedIndex="0"
SelectedValue="{Binding cmbTransitWarehouseVal}"
SelectionChanged="cmbTransitWarehouse_SelectionChanged"
Style="{StaticResource RoundedComboBox}">
<!--<ComboBoxItem Content="仓库地址" />-->
</ComboBox>
</wpf:TitleContent>
<wpf:TitleContent
Title=""
TitleHorizontalAlignment="Right"
TitleWidth="{Binding ElementName=tcShopGoodsName, Path=TitleWidth}">
<Button
x:Name="btnManualUpdateTransitWarehouse"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="0"
Padding="4,0"
HorizontalAlignment="Right"
Command="{Binding UpdateTransitWarehouseCommand}"
Content="确认商品关联"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
</Grid>
</Grid>
</Grid>
</UserControl>
@@ -0,0 +1,106 @@
using _29WxOrderWpf.ViewModels;
using AllBase.Model.DBModel;
using CefSharp.Wpf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace _29WxOrderWpf.Ctrls.BuyerCtrls;
/// <summary>
/// TaobaoBuyOrderCtrl.xaml 的交互逻辑
/// </summary>
public partial class TaobaoBuyOrderCtrl : UserControl
{
/// <summary>视图模型</summary>
public TaobaoBuyOrderViewModel ViewModel { get; }
public TaobaoBuyOrderCtrl(BuyerLoginInfo buyerInfo, oms_wei_order_item_info orderItemInfo)
{
InitializeComponent();
foreach (var warehouse in TransitWarehouseData.TransitWarehouseList)
{
this.cmbTransitWarehouse.Items.Add(warehouse.TransName + " " + warehouse.TransFullAddress);
}
ViewModel = new TaobaoBuyOrderViewModel(buyerInfo, orderItemInfo);
ViewModel.BrowserCreated += ViewModel_BrowserCreated;
ViewModel.RequestClose += ViewModel_RequestClose;
DataContext = ViewModel;
}
private async void taobaoBuyOrderCtrl_Loaded(object sender, RoutedEventArgs e)
{
btnManualUpdateSendProvince.Visibility = Visibility.Collapsed;
if (this.ViewModel.BuyType == "direct")
{
this.tcBuyAddress.Title = "拍单地址:";
}
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
{
parentWindow.Closed += ParentWindow_Closed;
}
await ViewModel.Start();
}
private void ParentWindow_Closed(object sender, EventArgs e)
{
ViewModel.Stop();
}
private void ViewModel_BrowserCreated(ChromiumWebBrowser browser)
{
Grid.SetRow(browser, 0);
Grid.SetColumn(browser, 0);
BrowserHost.Children.Add(browser);
}
private void ViewModel_RequestClose()
{
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
parentWindow.Close();
}
private void txtAddress_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
ViewModel.ReloadCommand.Execute(null);
}
}
private void cmbTransitWarehouse_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void imgOrderItem_MouseDown(object sender, MouseButtonEventArgs e)
{
if (imgOrderItem.Width == 100)
{
imgOrderItem.Width = 300;
imgOrderItem.Height = 300;
}
else
{
imgOrderItem.Width = 100;
imgOrderItem.Height = 100;
}
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,735 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.BuyerCtrls.TbBuyerOrderReadCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="tbBuyerOrderReadCtrl"
d:DesignHeight="450"
d:DesignWidth="1000"
Loaded="UserControl_Loaded"
mc:Ignorable="d">
<Border
Background="White"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1,1,0,1"
CornerRadius="5,0,0,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button
x:Name="btnHideAll"
Grid.Row="1"
Width="25"
Height="60"
Margin="-20,0,0,20"
HorizontalAlignment="left"
Click="btnHideAll_Click"
Style="{StaticResource BasePageButtonStyle}">
<TextBlock Margin="0,0,5,0">
关<LineBreak />
闭</TextBlock>
</Button>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Image
Width="16"
Height="16"
Margin="12,0,4,0"
Cursor="Hand"
MouseLeftButtonUp="btnHideAll_Click"
Source="{StaticResource imgCloseGray}"
Visibility="Collapsed" />
<WrapPanel Grid.Column="1" VerticalAlignment="Center">
<CheckBox
x:Name="chkAutoReadBuyerOrder"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkAutoReadBuyerOrder_CheckedChanged"
Content="自动读淘宝买手单"
FontSize="12"
IsChecked="true"
Unchecked="chkAutoReadBuyerOrder_CheckedChanged" />
<CheckBox
x:Name="chkHideNoWxIdOrder"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkHideNoWxIdOrder_CheckedChanged"
Content="隐藏无微信订单的买手单"
FontSize="12"
IsChecked="True"
Unchecked="chkHideNoWxIdOrder_CheckedChanged" />
<CheckBox
x:Name="chkAutoAfterSale"
Margin="6,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Checked="chkAutoAfterSale_Checked"
Content="未发货订单自动售后"
FontSize="12"
IsChecked="True"
Unchecked="chkAutoAfterSale_Checked"
Visibility="Visible" />
<Button
x:Name="btnSearch"
Grid.Column="8"
Width="118"
Height="24"
Margin="4,0,0,0"
Click="btnSearch_Click"
Content="刷新订单"
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnNextBuyer"
Grid.Column="8"
Height="24"
Margin="4,0,0,0"
Padding="4,0"
Click="btnNextBuyer_Click"
Content="下一个买手"
Style="{StaticResource BasePageButtonStyle}" />
</WrapPanel>
<TextBox
x:Name="txtFilter"
Grid.Column="2"
Height="28"
Margin="28,0,8,0"
VerticalContentAlignment="Center"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
TextChanged="txtFilter_TextChanged" />
<Button
x:Name="btnFilter"
Grid.Column="3"
Width="50"
Height="24"
Margin="4,0,8,0"
Click="btnFilter_Click"
Content="过滤"
Style="{StaticResource BasePageButtonStyle}" />
</Grid>
<Grid
x:Name="GridCef"
Grid.Row="1"
Background="LightGray" />
<Grid
Grid.Row="1"
Margin="2,2,0,334"
HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Border
x:Name="borderTbBuyer"
Width="138"
Background="White"
CornerRadius="0,4,4,0">
<Grid>
<ListBox x:Name="lbTbBuyer">
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!--<local:ShopListRowCtrl></local:ShopListRowCtrl>-->
<Border
MinHeight="50"
Margin="0,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
BorderBrush="{StaticResource ListRowBorderColorBrush}"
BorderThickness="0,0,0,1"
CornerRadius="0">
<Border.Style>
<!-- 鼠标进入或悬停Border时切换颜色(悬停时Border的填充控件必须有填充Border,所在层级不限,仅填充透明Grid则触发器无效) -->
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource ListRowHoverBackColorBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid x:Name="gridListItem">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="colCheck" Width="25*" />
<ColumnDefinition x:Name="colBuyerName" Width="100*" />
</Grid.ColumnDefinitions>
<CheckBox
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
Click="CheckBox_Click"
IsChecked="{Binding IsSelect, Mode=TwoWay}" />
<TextBox
x:Name="txtBuyerNick"
Grid.Column="1"
HorizontalContentAlignment="Left"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
Cursor="Hand"
IsReadOnly="True"
Loaded="txtBuyerNick_Loaded"
Text="{Binding buyer_nick}"
TextWrapping="Wrap" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Border>
<Border
Grid.Column="1"
Height="60"
Margin="-2,0,0,0"
VerticalAlignment="Center"
Panel.ZIndex="-1"
Background="{StaticResource pageColorBrush}"
CornerRadius="0,5,5,0"
Cursor="Hand">
<Button
x:Name="btnHideBuyer"
Grid.Column="1"
Width="20"
Height="60"
Margin="0,0,0,0"
Padding="0,0,0,0"
VerticalContentAlignment="Center"
Click="btnHideBuyer_Click"
Content="◀"
Style="{StaticResource BasePageButtonStyle}" />
</Border>
</Grid>
<Grid
Grid.Row="1"
Margin="0"
VerticalAlignment="Bottom"
Background="Transparent"
Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button
x:Name="btnHide"
Width="60"
Height="25"
Margin="0,0,0,-10"
Padding="0,2,0,0"
VerticalContentAlignment="top"
Click="btnHide_Click"
Content="▼"
Style="{StaticResource BasePageButtonStyle}" />
<Grid
x:Name="gridTable"
Grid.Row="1"
Height="330"
Margin="2"
VerticalAlignment="Bottom"
Background="White"
Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label
x:Name="lblMsg"
Margin="180,0,0,0"
VerticalAlignment="Center"
Panel.ZIndex="1"
Content="正在操作:" />
<TabControl
x:Name="tabOrderType"
Grid.Row="1"
Margin="0,-32,0,1"
VerticalAlignment="Stretch">
<TabControl.Resources>
<Style TargetType="{x:Type TabControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border
Grid.Row="1"
MinHeight="4"
Background="#f8f8f9"
BorderBrush="#e0e0e0"
BorderThickness="1,1,1,0"
CornerRadius="0,4,0,0">
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" />
</Border>
<Border
Margin="0,0,0,0"
HorizontalAlignment="Left"
Background="#e8e8e9"
BorderBrush="#e1e1e1"
BorderThickness="1,1,1,0"
CornerRadius="4,4,0,0">
<TabPanel
x:Name="HeaderPanel"
Background="Transparent"
IsItemsHost="True" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TabItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border
Name="Border"
Margin="-1,-2,-1,0"
BorderThickness="1,1,1,0"
CornerRadius="4,4,0,0">
<ContentPresenter
x:Name="ContentSite"
Margin="10,5"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ContentSource="Header" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="#f8f8f9" />
<Setter TargetName="Border" Property="BorderBrush" Value="#e0e0e0" />
<Setter TargetName="Border" Property="Margin" Value="-1,-3,-1,-1" />
<Setter Property="Foreground" Value="{StaticResource pageColorBrush}" />
<Setter Property="Panel.ZIndex" Value="100" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="#999999" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<TabItem Header="买手订单">
<DataGrid
x:Name="dgBuyerOrder"
Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ColumnHeaderHeight="30"
HorizontalGridLinesBrush="{StaticResource HorizontalGridLinesBrush}"
LoadingRow="dgBuyerOrder_LoadingRow"
RowHeaderWidth="0"
RowHeight="50"
SelectionChanged="dgBuyerOrder_SelectionChanged"
VerticalGridLinesBrush="{StaticResource VerticalGridLinesBrush}">
<DataGrid.Columns>
<DataGridTextColumn
Width="40"
Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
CanUserSort="False"
Header="序列"
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.6*"
Binding="{Binding WxSendTypeStr}"
Header="是否直发">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding order_sn}"
Header="拍单订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding ShopOrderIdStr}"
Header="店铺订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding buyerName}"
Header="买手名称">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding OrderTimeStr}"
Header="拍单时间">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.8*"
Binding="{Binding ProdInfoStr}"
Header="商品信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding AmoutValue}"
Header="金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding order_status_prompt}"
Header="订单状态">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding outExpressCompanyCode}"
Header="物流名称">
<!-- outExpressCompanyName -->
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding tracking_number}"
Header="物流单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding sendStatus}"
Header="订单信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn
x:Name="colSendBuyerOrder"
Width="0.6*"
Header="手动发送">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button
x:Name="btnSendBuyerOrder"
Grid.Row="2"
Grid.Column="1"
Margin="4,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="Transparent"
Click="btnSendBuyerOrder_Click"
Content="发送"
Foreground="{StaticResource PageLinkBrush}"
Visibility="{Binding TransitWarehouseIdStr, Converter={StaticResource HasTextVisibility}}" />
<Button
x:Name="btnSendDirectBuyerOrder"
Grid.Row="2"
Grid.Column="1"
Margin="4,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="Transparent"
Click="btnSendBuyerOrder_Click"
Content="发送"
Foreground="{StaticResource PageLinkBrush}"
Visibility="{Binding WxSendTypeStr, Converter={StaticResource HasTextVisibility}}" />
<!-- 直发单直发标注不为空 -->
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem Header="买手售后">
<DataGrid
x:Name="dgBuyerAfterSale"
Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
ColumnHeaderHeight="30"
HorizontalGridLinesBrush="{StaticResource HorizontalGridLinesBrush}"
LoadingRow="dgBuyerOrder_LoadingRow"
RowHeaderWidth="0"
RowHeight="50"
VerticalGridLinesBrush="{StaticResource VerticalGridLinesBrush}">
<DataGrid.Columns>
<DataGridTextColumn
Width="40"
Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
CanUserSort="False"
Header="序列"
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.6*"
Binding="{Binding WxSendTypeStr}"
Header="是否直发">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding afterSalesId}"
Header="售后单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding orderSn}"
Header="拍单订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.5*"
Binding="{Binding ShopOrderIdStr}"
Header="店铺订单号">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding buyerName}"
Header="买手名称">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding orderDate}"
Header="拍单日期">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1.8*"
Binding="{Binding ProdInfoStr}"
Header="商品信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding OrderAmountValue}"
Header="订单金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="0.8*"
Binding="{Binding RefundAmountValue}"
Header="售后金额">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding AfterSaleStatusStr}"
Header="售后状态">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn
Width="1*"
Binding="{Binding sendStatus}"
Header="订单信息">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="5" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!--<DataGridTemplateColumn Width="0.6*" Header="手动发送" x:Name="colSendBuyerOrderAfterSale" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Grid.Column="1" Grid.Row="2" x:Name="btnSendBuyerOrder" VerticalAlignment="Center" Background="Transparent" HorizontalAlignment="Center"
Foreground="{StaticResource PageLinkBrush}" BorderBrush="Transparent" Margin="4,0,0,0" Content="发送" Click="btnSendBuyerOrder_Click"
Visibility="{Binding TransitWarehouseIdStr, Converter={StaticResource HasTextVisibility}}"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>-->
</DataGrid.Columns>
</DataGrid>
</TabItem>
</TabControl>
</Grid>
</Grid>
</Grid>
</Border>
</UserControl>
File diff suppressed because it is too large. Load diff
@@ -11,7 +11,7 @@ using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using TinyPinyin;
using WxOrder.Framework.Commons.pinyin;
namespace _29WxOrderWpf.Ctrls.Commons
{
@@ -0,0 +1,91 @@
using _29WxOrderWpf.BaseWindows;
using _29WxOrderWpf.Ctrls.BuyerCtrls;
using _29WxOrderWpf.ViewModels;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using TemuKJD.ToolForms;
using WxOrder.Framework.Commons;
namespace _29WxOrderWpf.Ctrls.OrderCtrls;
internal class OrderBuyerOrdersHelper
{
public static void ShowBuyerOrder(oms_wei_order_item_info orderItem, string buyerAccount, string buyerName, string outOrderId, bool isShowOrderList = false)
{
if (outOrderId.StartsWith("tb_")) // 淘宝买手及订单
{
var buyer = GlobalConfig.TaobaoBuyerLoginList.FirstOrDefault(p => p.buyer_id == buyerAccount || p.buyer_name == buyerName);
if (buyer == null)
{
BaseMsgWindow.ShowError("该订单买手号未在当前账户登录");
return;
}
var url = "";
if (isShowOrderList)
url = "https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?";
else
url = "https://trade.tmall.com/detail/orderDetail.htm?bizOrderId=" + outOrderId.Replace("tb_", "");
TaobaoBuyOrderCtrl taobaoBuyView = new TaobaoBuyOrderCtrl(GlobalConfig.CurrentTaobaoBuyer, orderItem);
taobaoBuyView.ViewModel.InitUrl = url;
new DialogWindow()
{
Title = "订单查看 - 当前买手 " + buyer.buyer_nick,
Content = taobaoBuyView,
Width = SystemParameters.PrimaryScreenWidth < 1920 ? SystemParameters.PrimaryScreenWidth : SystemParameters.PrimaryScreenWidth * 90 / 100,
Height = SystemParameters.PrimaryScreenHeight * 90 / 100,
WindowStartupLocation = WindowStartupLocation.CenterScreen,
}.ShowDialog();
}
else // 拼多多买手及订单
{
var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(p => p.buyer_id == buyerAccount || p.buyer_name == buyerName);
if (buyer == null)
{
BaseMsgWindow.ShowError("该订单买手号未在当前账户登录");
return;
}
var url = "";
if (isShowOrderList)
url = "https://mobile.yangkeduo.com/index.html"; /* 订单列表 */
else
url = "https://mobile.yangkeduo.com/order.html?order_sn=" + outOrderId + "&page_from=1&main_orders=1&is_tester=1&refer_page_name=my_order" +
"&refer_page_id=10032_" + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now) + "_" + Randomx.GetWordNumber(10) + "&refer_page_sn=10032";
// 拍单的时候检测一下买手号
if (buyer.status == "在线")
{
PddMobileLoginViewModel.CheckBuyerLogin(buyer);
}
if (buyer.status != "在线")
{
BaseMsgWindow.ShowError("买手号掉线");
return;
}
PddMobileBuyOrderForm buyOrderForm = new PddMobileBuyOrderForm(MainWindow.Instance.orderListCtrl.FilterOneOrder, StartUp.UpdateBalance, orderItem, buyer, orderItem.PddBuyMap)
{
TitleText = "订单查看 - 当前买手 " + buyer.buyer_nick,
InitUrl = url /* 订单页面 */
};
buyOrderForm.pnlBuy.Visible = false;
//已有拍单关联的控制界面显示隐藏
if (orderItem.PddBuyMap != null)
{
buyOrderForm.pnlBuy.Visible = true;
buyOrderForm.pnlMap.Visible = false;
}
buyOrderForm.ShowDialog();
}
}
}
@@ -1,6 +1,5 @@
using _29WxOrderWpf.BaseWindows;
using _29WxOrderWpf.Commands;
using _29WxOrderWpf.Common;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Ctrls.PDDInvoice;
using _29WxOrderWpf.Ctrls.Statistics;
using _29WxOrderWpf.Services;
@@ -15,6 +14,7 @@ using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using Work._29Tools.BLL;
using WxOrder.Framework.Commons.Dialogs;
using static _29WxOrderWpf.Services.ShipGiftService;
namespace _29WxOrderWpf.Ctrls.OrderCtrls;
@@ -22,22 +22,18 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls;
public partial class OrderListCtrl
{
#region 统计
private DialogWindow _statisticsDialog;
private ShopRevenueStatisticsView _statisticsDialog;
public ICommand ShowShopRevenueStatisticsDialogViewCommand => new DelegateCommand(ShowShopRevenueStatisticsDialogView);
private void ShowShopRevenueStatisticsDialogView()
{
if (_statisticsDialog == null)
{
_statisticsDialog = new DialogWindow()
{
Title = "统计",
Content = new ShopRevenueStatisticsView(),
};
_statisticsDialog = new ShopRevenueStatisticsView();
_statisticsDialog.Closed += (s, e) => _statisticsDialog = null;
}
_statisticsDialog.Show();
_statisticsDialog.Activate();
}
#endregion
@@ -162,7 +158,7 @@ public partial class OrderListCtrl
if (ret)
{
sucessCount++;
this.GetOrder(item.order_id);
await this.GetOrder(item.order_id);
SetProgress(index, count);
item.IsSelect = false;
}
@@ -312,11 +308,8 @@ public partial class OrderListCtrl
private void ShowPDDInvoiceDialog()
{
new DialogWindow
{
Title = "发票助手",
Content = new PDDInvoiceView()
}.Show();
var view = new PDDInvoiceView();
DialogService.ShowOrActivateWindow(view);
}
#endregion
}
+281 -75
View File
@@ -2,7 +2,7 @@
x:Class="_29WxOrderWpf.Ctrls.OrderCtrls.OrderListCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:_29WxOrderWpf.Common"
xmlns:c="WxOrder.Framework"
xmlns:converters="clr-namespace:_29WxOrderWpf.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
@@ -10,6 +10,7 @@
xmlns:usercontrols="clr-namespace:_29WxOrderWpf.UserControls"
xmlns:utils="clr-namespace:_29WxOrderWpf.Utils"
xmlns:wpf="WPFCommon"
d:DataContext="{d:DesignInstance Type=local:OrderListCtrl}"
d:DesignHeight="450"
d:DesignWidth="1560"
Loaded="Window_Loaded"
@@ -144,6 +145,7 @@
VerticalContentAlignment="Center"
BorderBrush="Transparent"
SelectedIndex="0"
SelectionChanged="cmbTimeType_SelectionChanged"
Style="{StaticResource RoundedComboBox}"
Text="更新时间">
<ComboBoxItem>
@@ -168,7 +170,8 @@
Grid.Column="7"
Margin="0,0,14,0"
VerticalAlignment="Center"
BorderThickness="0" />
BorderThickness="0"
SelectedDate="{Binding DateStart}" />
<!-- 结束时间 -->
<Border
@@ -184,7 +187,8 @@
Grid.Column="8"
Margin="10,0,4,0"
VerticalAlignment="Center"
BorderThickness="0" />
BorderThickness="0"
SelectedDate="{Binding DateEnd}" />
<CheckBox
x:Name="chkEndDate"
Grid.Column="8"
@@ -192,6 +196,7 @@
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkEndDate_Click"
FontSize="12" />
<Button
@@ -260,17 +265,18 @@
Unchecked="chkAutoReadBuyerOrder_CheckedChanged" />
<CheckBox
x:Name="chkHideGreenFlag"
Grid.Column="12"
x:Name="chkSyncDirectOrderWaybill"
Margin="2,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
d:IsChecked="True"
d:Opacity="0.5"
d:Visibility="Visible"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkHideGreenFlag_Click"
Content="隐藏标记订单"
Click="chkSyncDirectOrderWaybill_Click"
Content="同步物流单"
FontSize="12"
IsChecked="{Binding orderFilterConfig.chkHideGreenFlagIsChecked}" />
IsChecked="False"
Visibility="Collapsed" />
</WrapPanel>
<wpf:SpacingStackPanel Grid.Column="13" HorizontalSpacing="5">
@@ -303,6 +309,26 @@
Grid.Row="1"
Margin="8,0,0,2">
<WrapPanel x:Name="wpFilter" VerticalAlignment="Top">
<CheckBox
x:Name="chkHideGreenFlag"
Grid.Column="12"
Margin="2,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
d:IsChecked="True"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkHideGreenFlag_Click"
Content="隐藏标记订单"
FontSize="12"
IsChecked="{Binding orderFilterConfig.chkHideGreenFlagIsChecked}" />
<Polyline
Grid.Column="5"
Width="10"
Margin="2,0"
VerticalAlignment="Center"
Points="5,0 5,4 5,0"
Stroke="{StaticResource mainColorBrush}"
StrokeThickness="2" />
<CheckBox
x:Name="chkOnlyWarehouseOrder"
Margin="0,2,3,2"
@@ -329,14 +355,7 @@
FontSize="12"
IsChecked="{Binding orderFilterConfig.chkNoMultiOrderIsChecked}"
Unchecked="chkSubFilterSonditions_Checked" />
<Polyline
Grid.Column="5"
Width="10"
Margin="2,0"
VerticalAlignment="Center"
Points="5,0 5,4 5,0"
Stroke="{StaticResource mainColorBrush}"
StrokeThickness="2" />
<CheckBox
x:Name="chkTransitOrder"
Margin="0,2,3,2"
@@ -472,8 +491,8 @@
SelectedIndex="0"
SelectionChanged="ComboBox_SelectionChanged"
Style="{StaticResource RoundedComboBox}">
<ComboBoxItem Content="1.55" />
<ComboBoxItem Content="1.6" />
<ComboBoxItem Content="礼品一" />
<ComboBoxItem Content="礼品二(实物)" />
</ComboBox>
</wpf:TitleContent>
<Button
@@ -486,6 +505,24 @@
Content="同步订单"
Style="{StaticResource BasePageButtonStyle}"
ToolTip="同步选中的订单或选中的店铺" />
<Polyline
Grid.Column="5"
Width="10"
Margin="2,0"
VerticalAlignment="Center"
Points="5,0 5,4 5,0"
Stroke="{StaticResource mainColorBrush}"
StrokeThickness="2" />
<CheckBox
x:Name="chkNoPickupNumOrder"
Margin="2,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkNoPickupNumOrder_Click"
Content="仅显示无取件码同步物流单"
FontSize="12"
IsChecked="False" />
</WrapPanel>
</Border>
<Grid
@@ -570,9 +607,10 @@
</TabControl.Resources>
<TabItem
MinWidth="60"
d:Header="待采购"
Background="Transparent"
BorderBrush="Transparent"
Header="待采购"
Header="{Binding WaitBuyTabTxt}"
SizeChanged="TabItem_SizeChanged">
<Border
Padding="0,10"
@@ -580,25 +618,64 @@
BorderThickness="0,0,0,1">
<WrapPanel>
<CheckBox
x:Name="chkMapProdOnly"
x:Name="chkNoMapProd"
Margin="8,0,4,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkMapProdOnly_Click"
Content="已关联拍单"
FontSize="12" />
<CheckBox
x:Name="chkNoMapProdOnly"
Margin="8,0,4,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkNoMapProdOnly_Click"
Click="chkMapProd_Click"
Content="未关联拍单"
FontSize="12" />
<CheckBox
x:Name="chkMapProd"
Margin="8,0,4,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkMapProd_Click"
Content="选择SKU"
FontSize="12" />
<CheckBox
x:Name="chkMapSku"
Margin="8,0,4,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkMapProd_Click"
Content="已关联拍单"
FontSize="12" />
<Button
x:Name="btnAutoBuy"
Width="Auto"
Height="22"
MinWidth="48"
Margin="8,0,4,0"
Padding="4,0"
Click="btnAutoBuy_Click"
Content="自动拍单"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
<!-- c:DebugVisibility.Enable="true" -->
<Button
x:Name="btnAutoBuyIntorduction"
Width="Auto"
Height="22"
MinWidth="48"
Margin="0,0,8,0"
Padding="4,0"
Click="btnAutoBuyIntroduction_Click"
Content="自动拍单设置说明"
FontSize="12"
Style="{StaticResource BasePageButtonLightStyle}" />
<Polyline
Grid.Column="5"
Width="10"
Margin="2,0"
VerticalAlignment="Center"
Points="5,0 5,4 5,0"
Stroke="{StaticResource mainColorBrush}"
StrokeThickness="2" />
<Button
Width="Auto"
Height="22"
@@ -614,35 +691,58 @@
</TabItem>
<TabItem
MinWidth="60"
d:Header="异常需重拍"
Background="Transparent"
BorderBrush="Transparent"
Foreground="#FFEE0099"
Header="异常需重拍"
Header="{Binding AbnormalTabTxt}"
SizeChanged="TabItem_SizeChanged" />
<TabItem
MinWidth="60"
Header="待发货"
d:Header="待发货"
Header="{Binding WaitSendTabTxt}"
SizeChanged="TabItem_SizeChanged">
<Border
Margin="4,0,4,4"
BorderBrush="#e0e0e0"
BorderThickness="0,0,0,1">
<CheckBox
x:Name="chkDirectSendFailed"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkDirectSendFailed_Click"
Content="直拍发货失败"
FontSize="12" />
<WrapPanel>
<CheckBox
x:Name="chkDirectSendFailed"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkDirectSendFailed_Click"
Content="直拍发货失败"
FontSize="12" />
<CheckBox
x:Name="chkWaitSend48HourNoWaybill"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkWaitSendNoWaybill_Click"
Content="48小时未发货"
FontSize="12" />
<CheckBox
x:Name="chkWaitSend72HourNoWaybill"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkWaitSendNoWaybill_Click"
Content="72小时未发货"
FontSize="12" />
</WrapPanel>
</Border>
</TabItem>
<TabItem
MinWidth="60"
d:Header="待收货"
Background="Transparent"
BorderBrush="Transparent"
Header="待收货"
Header="{Binding WaitReceiveTabTxt}"
SizeChanged="TabItem_SizeChanged">
<Border
Margin="4,0,4,4"
@@ -661,15 +761,43 @@
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<CheckBox
x:Name="chkNeedCheckExpress"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkNeedCheckExpress_Click"
Content="需核对物流"
FontSize="12" />
<WrapPanel>
<CheckBox
x:Name="chkNeedCheckExpress"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkNeedCheckExpress_Click"
Content="需核对物流"
FontSize="12" />
<Polyline
Grid.Column="3"
Width="10"
Margin="5,0"
VerticalAlignment="Center"
Points="5,0 5,8 5,0"
Stroke="{StaticResource mainColorBrush}"
StrokeThickness="2" />
<CheckBox
x:Name="chk48HourNoWaybill"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkNoWaybill_Click"
Content="48小时未发货"
FontSize="12" />
<CheckBox
x:Name="chk72HourNoWaybill"
Margin="6,8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkNoWaybill_Click"
Content="72小时未发货"
FontSize="12" />
</WrapPanel>
<WrapPanel
Grid.Column="2"
d:Opacity="0.2"
@@ -750,10 +878,11 @@
</TabItem>
<TabItem
MinWidth="60"
d:Header="需处理售后单"
Background="#FF6666"
BorderBrush="Transparent"
Foreground="#FF2222"
Header="需处理售后单"
Header="{Binding EmergencyManualReturnOrderTabTxt}"
SizeChanged="TabItem_SizeChanged">
<Border
Margin="4,0,4,4"
@@ -972,13 +1101,14 @@
<ComboBoxItem Content="请选择" />
<ComboBoxItem Content="未申请" />
<ComboBoxItem Content="申请中" />
<ComboBoxItem Content="拒收失败" />
<ComboBoxItem Content="申请失败" />
<ComboBoxItem Content="申请成功" />
<ComboBoxItem Content="拒收成功" />
</ComboBox>
</wpf:TitleContent>
<wpf:TitleContent
Title="拦截退回总店状态"
Margin="4,0,4,0"
Margin="8,0,4,0"
VerticalContentAlignment="Center"
FontSize="12"
Foreground="Black"
@@ -994,7 +1124,7 @@
<ComboBoxItem Content="请选择" />
<ComboBoxItem Content="未拦截" />
<ComboBoxItem Content="拦截中" />
<!--<ComboBoxItem Content="拦截失败" />-->
<ComboBoxItem Content="拦截失败" />
<ComboBoxItem Content="拦截成功" />
</ComboBox>
</wpf:TitleContent>
@@ -1027,10 +1157,11 @@
</TabItem>
<TabItem
MinWidth="60"
d:Header="退货仓自动售后单"
Background="Transparent"
BorderBrush="Transparent"
Foreground="#FF7744"
Header="退货仓自动售后单"
Header="{Binding EmergencyDistribReturnOrderTabTxt}"
SizeChanged="TabItem_SizeChanged">
<Border
Margin="4,0,4,4"
@@ -1051,17 +1182,7 @@
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<WrapPanel>
<Button
x:Name="btnBatchRefund2"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="6,6"
Padding="4,0"
Click="btnBatchRefund_Click"
Content="批量申请买手售后"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
<CheckBox
x:Name="chkShopIsRefund"
Grid.Column="0"
@@ -1100,16 +1221,83 @@
Click="chkUpShopAddressAnalyseFailed_Click"
Content="总店地址解析失败"
FontSize="12" />
<Polyline
Grid.Column="14"
Width="10"
Margin="5,0"
VerticalAlignment="Center"
Points="5,0 5,8 5,0"
Stroke="{StaticResource mainColorBrush}"
StrokeThickness="2"
Visibility="Visible" />
<wpf:TitleContent
Title="买手退货状态"
Margin="4,0,4,0"
VerticalContentAlignment="Center"
FontSize="12"
Foreground="Black"
Placement="Left"
TitleVerticalAlignment="Center">
<ComboBox
x:Name="cmbReturnOrderBuyerStatus"
Width="130"
Height="23"
SelectedIndex="0"
SelectionChanged="cmbReturnOrderBuyerStatus_SelectionChanged"
Style="{StaticResource RoundedComboBox}">
<ComboBoxItem Content="请选择" />
<ComboBoxItem Content="买手待申请售后" />
<ComboBoxItem Content="买手待退货" />
<ComboBoxItem Content="买手已寄出待商家退款" />
<ComboBoxItem Content="买手退货失败" />
</ComboBox>
</wpf:TitleContent>
<Button
x:Name="btnBatchRefund2"
Grid.Column="1"
Height="20"
MinWidth="48"
Margin="6,6"
Padding="4,0"
Click="btnBatchRefund_Click"
Content="批量申请买手售后"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}" />
<wpf:TitleContent
Title="退货仓状态"
Margin="8,0,4,0"
VerticalContentAlignment="Center"
FontSize="12"
Foreground="Black"
Placement="Left"
TitleVerticalAlignment="Center">
<ComboBox
x:Name="cmbReturnOrderStatus"
Width="100"
Height="23"
SelectedIndex="0"
SelectionChanged="cmbReturnOrderStatus_SelectionChanged"
Style="{StaticResource RoundedComboBox}">
<ComboBoxItem Content="请选择" />
<ComboBoxItem Content="未创建" />
<ComboBoxItem Content="创建失败" />
<ComboBoxItem Content="已创建未到仓" />
<ComboBoxItem Content="已到仓" />
<ComboBoxItem Content="已发回" />
</ComboBox>
</wpf:TitleContent>
</WrapPanel>
</Grid>
</Border>
</TabItem>
<TabItem
MinWidth="60"
d:Header="售后完成单"
Background="Transparent"
BorderBrush="Transparent"
Foreground="#FFaa77"
Header="售后完成单"
Header="{Binding RefundTabTxt}"
SizeChanged="TabItem_SizeChanged">
<Border
Margin="4,0,4,4"
@@ -1197,9 +1385,10 @@
</TabItem>
<TabItem
MinWidth="60"
d:Header="全部订单"
Background="Transparent"
BorderBrush="Transparent"
Header="全部订单"
Header="{Binding AllOrderTabTxt}"
SizeChanged="TabItem_SizeChanged" />
<!--<TabItem Header="发货异常">
<Grid Background="#FFE5E5E5"/>
@@ -1230,7 +1419,8 @@
CanUserReorderColumns="False"
ColumnDisplayIndexChanged="dgOrderHeader_ColumnDisplayIndexChanged"
ColumnHeaderHeight="{Binding ElementName=lstTitle, Path=ActualHeight}"
LayoutUpdated="dgOrderHeader_LayoutUpdated">
LayoutUpdated="dgOrderHeader_LayoutUpdated"
Sorting="dgOrderHeader_Sorting">
<DataGrid.Columns>
<DataGridTextColumn
Width="38"
@@ -1277,9 +1467,20 @@
Header="店铺单号"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
x:Name="dgHeaderTime"
Width="90*"
Header="交易时间"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
Header="交易时间 ▼"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<!-- 设置 Cursor 为 Hand -->
<TextBlock
x:Name="tbHeaderTimeTxt"
Cursor="Hand"
Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.ColumnHeaderTitle}" />
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
<DataGridTextColumn
Width="65*"
Header="利润"
@@ -1311,9 +1512,14 @@
Grid.Row="4"
Margin="7,0,7,0"
HorizontalContentAlignment="Stretch"
AlternationCount="1000000"
BorderThickness="0"
ScrollViewer.CanContentScroll="True"
VirtualizingPanel.ScrollUnit="Pixel">
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<!-- VirtualizingStackPanel.VirtualizationMode="Recycling" -->
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
File diff suppressed because it is too large. Load diff
@@ -1,42 +1,97 @@
<UserControl x:Class="_29WxOrderWpf.Ctrls.OrderCtrls.OrderListRowCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
xmlns:uc="clr-namespace:_29WxOrderWpf.UserControls"
mc:Ignorable="d"
d:DesignHeight="230" d:DesignWidth="1200">
<Border Margin="0,12,8,0" HorizontalAlignment="Stretch" VerticalAlignment="Center" BorderThickness="1"
BorderBrush="{StaticResource ListRowBorderColorBrush}" CornerRadius="10">
<Border.Style>
<!-- 鼠标进入或悬停Border时切换颜色(悬停时Border的填充控件必须有填充Border,所在层级不限,仅填充透明Grid则触发器无效) -->
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource ListRowHoverBackColorBrush}"/>
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<UserControl
x:Class="_29WxOrderWpf.Ctrls.OrderCtrls.OrderListRowCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:uc="clr-namespace:_29WxOrderWpf.UserControls"
d:DesignHeight="230"
d:DesignWidth="1200"
mc:Ignorable="d">
<Border
Margin="0,12,8,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
BorderBrush="{StaticResource ListRowBorderColorBrush}"
BorderThickness="1"
CornerRadius="10">
<Border.Style>
<!-- 鼠标进入或悬停Border时切换颜色(悬停时Border的填充控件必须有填充Border,所在层级不限,仅填充透明Grid则触发器无效) -->
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource ListRowHoverBackColorBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!--子控件是普通控件而非模板页控件,无需指定DataContext="{Binding}"-->
<local:OrderListRowHeaderCtrl></local:OrderListRowHeaderCtrl>
<!--<local:OrderListRowHeaderCtrl DataContext="{Binding}"></local:OrderListRowHeaderCtrl>-->
<Border Grid.Row="1" Background="Transparent" CornerRadius="0,0,12,12" >
<Grid x:Name="gridChildOrder">
<Grid.RowDefinitions>
<RowDefinition Height="6"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="6"></RowDefinition>
</Grid.RowDefinitions>
</Grid>
</Border>
</Grid>
</Border>
<!-- 子控件是普通控件而非模板页控件,无需指定DataContext="{Binding}" -->
<local:OrderListRowHeaderCtrl />
<!--<local:OrderListRowHeaderCtrl DataContext="{Binding}"></local:OrderListRowHeaderCtrl>-->
<Border
Grid.Row="1"
Background="Transparent"
CornerRadius="0,0,12,12">
<Grid x:Name="gridChildOrder">
<Grid.RowDefinitions>
<RowDefinition Height="6" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="6" />
</Grid.RowDefinitions>
<local:OrderListRowItemCtrl
Grid.Row="1"
DataContext="{Binding orderItem}"
Visibility="{Binding OrderItemVisibility}" />
<!--<local:OrderListRowItemCtrl
Grid.Row="2"
DataContext="{Binding orderItem2}"
Visibility="{Binding OrderItemVisibility}" />
<local:OrderListRowItemCtrl
Grid.Row="3"
DataContext="{Binding orderItem2}"
Visibility="{Binding OrderItemVisibility}" />
<local:OrderListRowItemCtrl
Grid.Row="4"
DataContext="{Binding orderItem3}"
Visibility="{Binding OrderItemVisibility}" />
<local:OrderListRowItemCtrl
Grid.Row="5"
DataContext="{Binding orderItem4}"
Visibility="{Binding OrderItemVisibility}" />-->
<!--<ItemsControl Grid.Row="1" ItemsSource="{Binding orderItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:OrderListRowItemCtrl DataContext="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>-->
<!--<ListBox
Grid.Row="1"
ItemsSource="{Binding orderItems}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<ListBox.ItemTemplate>
<DataTemplate>
<local:OrderListRowItemCtrl DataContext="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>-->
<!--<TextBlock Text="{Binding ProductName}" Margin="20,0,0,0"/>-->
</Grid>
</Border>
</Grid>
</Border>
</UserControl>
@@ -41,21 +41,23 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
private async void OrderListRowCtrl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
int index = 0;
foreach (var orderItem in order.orderItems)
{
gridChildOrder.RowDefinitions.Insert(gridChildOrder.RowDefinitions.Count - 1, new RowDefinition() { Height = GridLength.Auto });
index++;
var rowItem = new OrderListRowItemCtrl() { DataContext = orderItem, Name = "rowItem" + index };
Grid.SetRow(rowItem, index);
this.gridChildOrder.Children.Add(rowItem);
if (index >= 5)
break;
}
}
}
//await Task.Run(() => { Thread.Sleep(1); });
//if (this.DataContext is oms_wei_order_info order)
//{
// int index = 0;
// foreach (var orderItem in order.orderItems)
// {
// gridChildOrder.RowDefinitions.Insert(gridChildOrder.RowDefinitions.Count - 1, new RowDefinition() { Height = GridLength.Auto });
// index++;
// var rowItem = new OrderListRowItemCtrl() { DataContext = orderItem, Name = "rowItem" + index };
// Grid.SetRow(rowItem, index);
// this.gridChildOrder.Children.Add(rowItem);
// if (index >= 5)
// break;
// }
//}
}
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
@@ -7,7 +7,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:uc="clr-namespace:_29WxOrderWpf.UserControls"
d:DesignHeight="50"
d:DesignWidth="800"
d:DesignWidth="850"
mc:Ignorable="d">
<Border Background="{StaticResource ListRowBorderColorBrush}" CornerRadius="12,12,0,0">
@@ -26,6 +26,7 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<TextBox
@@ -39,7 +40,7 @@
Foreground="{Binding OrderBuyTypeColor}"
IsReadOnly="True"
Text="{Binding OrderBuyType}"
Visibility="{Binding OrderBuyType, Converter={StaticResource HasTextVisibility}}" />
Visibility="{Binding OrderBuyTypeVisibility}" />
<TextBox
Grid.Column="1"
Margin="8,8,-4,8"
@@ -158,7 +159,7 @@
BorderThickness="0"
FontSize="7"
FontWeight="Bold"
Foreground="{Binding Shop.LoginStatusStr, Converter={StaticResource statusToColorBrushConverter}}"
Foreground="{Binding Shop.LoginStatusStrColor}"
IsReadOnly="True"
Text="{Binding Shop.LoginStatusStr}"
WaterMark="店铺状态" />
@@ -167,6 +168,7 @@
Grid.Column="6"
Margin="4,8,4,8"
VerticalAlignment="Center"
d:Text="店铺名称"
Background="Transparent"
BorderThickness="0"
Cursor="Hand"
@@ -205,13 +207,27 @@
Background="Transparent"
BorderThickness="0"
FontSize="14"
Foreground="Gray"
Foreground="#FF8888"
IsReadOnly="True"
Text="{Binding OrderDiffItemCountStr}"
WaterMark="该订单共有 1 条不同商品记录" />
<TextBlock
Grid.Column="11"
Margin="10"
Margin="0,0,8,0"
HorizontalAlignment="Right"
Cursor="Hand"
FontSize="20"
FontWeight="Bold"
Foreground="{StaticResource mainColorBrush}"
MouseLeftButtonUp="TextBlock_MouseLeftButtonUp"
Style="{StaticResource TextBlockIcon}"
Text="{StaticResource txt-arrow_sync}"
ToolTip="刷新订单状态" />
<!-- Foreground="{Binding ElementName=b_gift, Path=BorderBrush}" -->
<TextBlock
Grid.Column="12"
Margin="0,0,8,0"
VerticalAlignment="Center"
d:Text="仅退款/退货退款"
Foreground="Gray"
@@ -219,9 +235,8 @@
<Border
x:Name="borderFlag"
Grid.Column="12"
Grid.Column="13"
Width="auto"
Height="15"
Margin="2"
VerticalAlignment="Center"
Background="Transparent"
@@ -229,6 +244,13 @@
MouseLeftButtonDown="borderFlag_MouseLeftButtonDown">
<!--<Path Margin="0,0,0,0" Fill="{StaticResource FlagGrayBrush}" Data="M 0,0 L 1,0 L 1,1 L 10,1 L 7,4 L 10,7 L 1,7 L 1,12 L 0,12 Z" Stretch="Uniform" />-->
<WrapPanel VerticalAlignment="Center">
<Button
Width="60"
Height="22"
Margin="0,0,10,0"
Click="btn_createOrderSupportTicket"
Content="创建工单"
Style="{StaticResource BasePageButtonStyle}" />
<TextBlock
VerticalAlignment="Center"
FontSize="12"
@@ -240,9 +262,10 @@
Margin="2,0,0,0"
d:Fill="SkyBlue"
Data="M 0,0 L 1,0 L 1,1 L 10,1 L 7,4 L 10,7 L 1,7 L 1,12 L 0,12 Z"
Fill="{Binding colour_flag, Converter={StaticResource flagColorConverter}}"
Fill="{Binding ColourFlagBrush}"
Stretch="Uniform" />
<!-- ColourFlagBrush -->
<!-- Fill="{Binding colour_flag, Converter={StaticResource flagColorConverter}}" -->
</WrapPanel>
</Border>
@@ -3,6 +3,7 @@ using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using NaiBa.Util.Extension;
using OrderSupportTicket.Models;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -25,43 +26,45 @@ using Work._29Tools.Forms.ShopForms;
namespace _29WxOrderWpf.Ctrls.OrderCtrls
{
/// <summary>
/// OrderListRowHeaderCtrl.xaml 的交互逻辑
/// </summary>
public partial class OrderListRowHeaderCtrl : UserControl
{
public OrderListRowHeaderCtrl()
{
InitializeComponent();
this.DataContextChanged += OrderListRowHeaderCtrl_DataContextChanged;
txtOrderId.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtOrderId_MouseLeftButtonUp), true);
txtShopName.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtShopName_MouseLeftButtonUp), true);
}
/// <summary>
/// OrderListRowHeaderCtrl.xaml 的交互逻辑
/// </summary>
public partial class OrderListRowHeaderCtrl : UserControl
{
public static DateTime LastRefreshTime = DateTime.Now.AddSeconds(-5);
private void txtShopName_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ErpShopId == order.shop_id.ParseToString());
if (shop != null)
{
WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop);
ShopBLL.CheckShopLogin(shop);
if (shop.LoginStatus == "登录成功")
{
// 在线直接进店
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = System.Windows.Forms.FormWindowState.Maximized;
shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/home";
shopLoginForm.Show();
}
else
{
// 掉线登录
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.ShowDialog();
public OrderListRowHeaderCtrl()
{
InitializeComponent();
this.DataContextChanged += OrderListRowHeaderCtrl_DataContextChanged;
txtOrderId.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtOrderId_MouseLeftButtonUp), true);
txtShopName.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtShopName_MouseLeftButtonUp), true);
}
if (shop.LoginStatus == "登录成功")
private void txtShopName_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ErpShopId == order.shop_id.ParseToString());
if (shop != null)
{
WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop);
ShopBLL.CheckShopLogin(shop);
if (shop.LoginStatus == "登录成功")
{
// 在线直接进店
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = System.Windows.Forms.FormWindowState.Maximized;
shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/home";
shopLoginForm.Show();
}
else
{
// 掉线登录
shopLoginForm.openType = EnumOpenType.login;
shopLoginForm.ShowDialog();
if (shop.LoginStatus == "登录成功")
{
shop.Is29Supplier = false;
for (int i = 0; i < 100; i++)
@@ -82,87 +85,87 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
if (i * 20 >= totalCount)
break;
}
foreach (var ord in GlobalConfig.lstFilterOrder.Where(o => o.shop_id.ParseToString() == shop.ErpShopId).ToList())
{
// 更新代发管理情况
foreach (var orderItem in ord.orderItems)
Dispatcher.Invoke(new Action(() => { orderItem.UpdateOrderItemBuyButton(); }));
}
}
}
}
}
}
private void txtOrderId_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ErpShopId == order.shop_id.ParseToString());
if (shop != null)
{
WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop);
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = System.Windows.Forms.FormWindowState.Maximized;
{
shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/order/detail?orderid=" + order.order_id;
}
shopLoginForm.Show();
}
}
}
foreach (var ord in GlobalConfig.lstFilterOrder.Where(o => o.shop_id.ParseToString() == shop.ErpShopId).ToList())
{
// 更新代发管理情况
foreach (var orderItem in ord.orderItems)
Dispatcher.Invoke(new Action(() => { orderItem.UpdateOrderItemBuyButton(); }));
}
}
}
}
}
}
private void OrderListRowHeaderCtrl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
if (order.orderItems.Count > 5)
{
txtCount.Text = "该订单共计 " + order.orderItems.Count + " 件商品";
}
}
}
private void txtOrderId_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ErpShopId == order.shop_id.ParseToString());
if (shop != null)
{
WXShopLoginForm shopLoginForm = new WXShopLoginForm(shop);
shopLoginForm.openType = EnumOpenType.manage;
shopLoginForm.WindowState = System.Windows.Forms.FormWindowState.Maximized;
private void Path_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//var orderId = ((sender as Border)?.Tag).ParseToString();
if (this.DataContext is oms_wei_order_info order)
{
{
shopLoginForm.InitUrl = "https://store.weixin.qq.com/shop/order/detail?orderid=" + order.order_id;
}
shopLoginForm.Show();
}
}
}
try
{
//Clipboard.SetText(order.order_id); // 复制成功,但会报错,改为SetDataObject
Clipboard.SetDataObject(order.order_id);
BaseMsgWindow.ShowAnimateMessage("复制成功");
}
catch (Exception ex)
{
BaseMsgWindow.ShowError("复制失败 " + ex.Message);
}
}
}
private void OrderListRowHeaderCtrl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
if (order.orderItems.Count > 5)
{
//txtCount.Text = "该订单共计 " + order.orderItems.Count + " 件商品";
}
}
}
private void pathShop_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ErpShopId == order.shop_id.ParseToString());
if (shop != null)
{
try
{
Clipboard.SetDataObject(shop.ShopAccount);
BaseMsgWindow.ShowAnimateMessage("复制成功");
}
catch (Exception ex)
{
BaseMsgWindow.ShowError("复制失败 " + ex.Message);
}
}
}
}
private void Path_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//var orderId = ((sender as Border)?.Tag).ParseToString();
if (this.DataContext is oms_wei_order_info order)
{
try
{
//Clipboard.SetText(order.order_id); // 复制成功,但会报错,改为SetDataObject
Clipboard.SetDataObject(order.order_id);
BaseMsgWindow.ShowAnimateMessage("复制成功");
}
catch (Exception ex)
{
BaseMsgWindow.ShowError("复制失败 " + ex.Message);
}
}
}
private void pathShop_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is oms_wei_order_info order)
{
var shop = GlobalConfig.ShopLoginList.FirstOrDefault(s => s.ErpShopId == order.shop_id.ParseToString());
if (shop != null)
{
try
{
Clipboard.SetDataObject(shop.ShopAccount);
BaseMsgWindow.ShowAnimateMessage("复制成功");
}
catch (Exception ex)
{
BaseMsgWindow.ShowError("复制失败 " + ex.Message);
}
}
}
}
private void borderFlag_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
@@ -195,9 +198,59 @@ namespace _29WxOrderWpf.Ctrls.OrderCtrls
order.colour_flag = flag;
Thread.Sleep(1000);
Dispatcher.Invoke(new Action(() => { MainWindow.Instance.orderListCtrl.FilterOneOrder(order); }));
});
}
}
}
/// <summary>
/// 创建工单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btn_createOrderSupportTicket(object sender, RoutedEventArgs e)
{
if (!(this.DataContext is oms_wei_order_info order))
return;
var shop = order.Shop
?? GlobalConfig.ShopLoginList.FirstOrDefault(
s => s.ErpShopId == order.shop_id.ParseToString());
var appId = shop?.ShopId?.Trim();
if (string.IsNullOrWhiteSpace(appId)
|| string.IsNullOrWhiteSpace(order.order_id))
{
BaseMsgWindow.ShowAnimateMessage(
"订单缺少店铺 APPID 或订单号,无法创建工单",
"Error",
5);
return;
}
var ticketOrder = TicketOrderOption.FromWechatOrder(order, appId);
try
{
await MainWindow.Instance.CreateOrderSupportTicketAsync(ticketOrder);
}
catch (Exception ex)
{
BaseMsgWindow.ShowError("打开工单窗口失败:" + ex.Message);
}
}
private async void TextBlock_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (!(this.DataContext is oms_wei_order_info order))
return;
if (LastRefreshTime > DateTime.Now.AddSeconds(-5))
{
BaseMsgWindow.ShowAnimateMessage("操作太快了请稍候再点击", "Error", 5);
return;
}
LastRefreshTime = DateTime.Now;
await Task.Run(async () => { await MainWindow.Instance.orderListCtrl.GetOrder(order.order_id); });
}
}
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -2,7 +2,7 @@
x:Class="_29WxOrderWpf.Ctrls.OrderCtrls.OrderTaskDialogView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:comn="clr-namespace:_29WxOrderWpf.Common"
xmlns:comn="WxOrder.Framework"
xmlns:converters="clr-namespace:_29WxOrderWpf.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
@@ -1,4 +1,4 @@
using _29WxOrderWpf.Commands;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Services;
using AllBase.Model.MvvmBaseClasses;
using AllBase.Util;
@@ -0,0 +1,85 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.OrderCtrls.OrderTransitListCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wpf="WPFCommon"
d:DesignHeight="450"
d:DesignWidth="800"
Background="White"
Foreground="DimGray"
Loaded="OrderTransitListCtrl_Loaded"
mc:Ignorable="d">
<UserControl.Resources>
<Style BasedOn="{StaticResource TitleContentBaseStyle}" TargetType="wpf:TitleContent">
<Setter Property="Placement" Value="Left" />
<Setter Property="TitleVerticalAlignment" Value="Center" />
<Setter Property="LeftTitlePadding" Value="0,0,0,0" />
</Style>
<Style TargetType="wpf:SpacingStackPanel">
<Setter Property="Margin" Value="3,0" />
</Style>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Height="30" Orientation="Horizontal">
<TextBlock
Margin="10,0,0,0"
VerticalAlignment="Center"
Text="店铺:" />
<TextBox
VerticalContentAlignment="Center"
d:Text="音诉云仓"
Background="Transparent"
BorderThickness="0"
Foreground="DimGray"
IsReadOnly="True"
Text="{Binding ShopNameStr}" />
<TextBlock
Margin="10,0,0,0"
VerticalAlignment="Center"
Text="订单号:" />
<TextBox
VerticalContentAlignment="Center"
d:Text="3700000000000000"
Background="Transparent"
BorderThickness="0"
Foreground="DimGray"
IsReadOnly="True"
Text="{Binding OrderIdStr}" />
</StackPanel>
<ListBox
x:Name="lbxTransitList"
Grid.Row="4"
Margin="7,0,7,0"
HorizontalContentAlignment="Stretch"
BorderThickness="0">
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!-- 此处绑定将数据源传递给子自定义控件 -->
<local:OrderTransitListDetailCtrl DataContext="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</UserControl>
@@ -0,0 +1,64 @@
using AllBase.Model.DBModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace _29WxOrderWpf.Ctrls.OrderCtrls;
/// <summary>
/// OrderTransitListCtrl.xaml 的交互逻辑
/// </summary>
public partial class OrderTransitListCtrl : UserControl
{
OrderTransitListCtrlViewModel ViewModel;
public OrderTransitListCtrl(oms_wei_order_item_transit_model transitInfo)
{
InitializeComponent();
UpdateViewModel(transitInfo);
}
public void UpdateViewModel(oms_wei_order_item_transit_model transitInfo)
{
ViewModel = new OrderTransitListCtrlViewModel(transitInfo);
ViewModel.RequestClose += ViewModel_RequestClose;
DataContext = ViewModel;
this.lbxTransitList.ItemsSource = ViewModel.TransitInfo.OrderItemTransitDetailList;
}
private void ViewModel_RequestClose()
{
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
parentWindow.Close();
}
private void OrderTransitListCtrl_Loaded(object sender, RoutedEventArgs e)
{
Window parentWindow = Window.GetWindow(this);
if (parentWindow != null)
{
parentWindow.Closed += ChangeWaybillView_Closed;
}
ViewModel.Start();
}
private void ChangeWaybillView_Closed(object sender, EventArgs e)
{
ViewModel.Stop();
}
}
@@ -0,0 +1,62 @@
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _29WxOrderWpf.Ctrls.OrderCtrls;
public class OrderTransitListCtrlViewModel : PropertyNotifyObject
{
private volatile bool _isWindowLoaded = false;
public oms_wei_order_item_transit_model TransitInfo
{
get { return this.GetValue(x => x.TransitInfo); }
set { this.SetValue(x => x.TransitInfo, value); }
}
public oms_wei_order_item_info OrderItem
{
get { return this.GetValue(x => x.OrderItem); }
set { this.SetValue(x => x.OrderItem, value); }
}
public string OrderIdStr
{
get { return this.GetValue(x => x.OrderIdStr); }
set { this.SetValue(x => x.OrderIdStr, value); }
}
public string ShopNameStr
{
get { return this.GetValue(x => x.ShopNameStr); }
set { this.SetValue(x => x.ShopNameStr, value); }
}
/// <summary>请求关闭窗口</summary>
public event Action RequestClose;
public OrderTransitListCtrlViewModel(oms_wei_order_item_transit_model transitInfo)
{
TransitInfo = transitInfo;
OrderItem = transitInfo?.OrderItem;
OrderIdStr = OrderItem?.order_id;
ShopNameStr = OrderItem?.ItemOrder?.Shop?.ShopAccount;
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
_isWindowLoaded = true;
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
}
@@ -0,0 +1,411 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.OrderCtrls.OrderTransitListDetailCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wpf="WPFCommon"
d:DesignHeight="280"
d:DesignWidth="1200"
Background="White"
mc:Ignorable="d">
<UserControl.Resources>
<Style BasedOn="{StaticResource TitleContentBaseStyle}" TargetType="wpf:TitleContent">
<Setter Property="Placement" Value="Left" />
<Setter Property="TitleVerticalAlignment" Value="Center" />
<Setter Property="LeftTitlePadding" Value="0,0,0,0" />
</Style>
<Style TargetType="wpf:SpacingStackPanel">
<Setter Property="Margin" Value="3,0" />
</Style>
</UserControl.Resources>
<Border
MinHeight="50"
Margin="5"
BorderBrush="#8087CEEB"
BorderThickness="1"
CornerRadius="10">
<Grid Opacity="{Binding Opacity}">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Background="#5087CEEB" CornerRadius="8,8,0,0">
<StackPanel MinHeight="30" Orientation="Horizontal">
<TextBlock
Margin="10,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="仓库订单号" />
<TextBox
VerticalContentAlignment="Center"
d:Text="261008-123456789012345"
Background="Transparent"
BorderThickness="0"
Foreground="DimGray"
IsReadOnly="True"
Text="{Binding OrderCode}" />
<TextBlock
Margin="10,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
d:Text="发货包裹"
FontWeight="Bold"
Foreground="{Binding TransitTypeStrColor}"
Text="{Binding TransitTypeStr}" />
<TextBox
VerticalContentAlignment="Center"
d:Text="ABCDEF1"
Background="Transparent"
BorderThickness="0"
Foreground="DimGray"
IsReadOnly="True"
Text="{Binding SourceCode}" />
</StackPanel>
</Border>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="0.7*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="0.5*" />
</Grid.ColumnDefinitions>
<Border
Margin="0,10"
BorderBrush="LightSkyBlue"
BorderThickness="0,0,1,0">
<wpf:SpacingStackPanel
Margin="10,10"
VerticalAlignment="Center"
Orientation="Vertical"
VerticalSpacing="4">
<wpf:TitleContent Title="交易单号:" Foreground="#FF666666">
<TextBox
d:Text="371234567890123456"
Background="Transparent"
BorderThickness="0"
Foreground="#FF888888"
IsReadOnly="True"
Text="{Binding WxOrderId}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="采购账户:" Foreground="#FF666666">
<WrapPanel>
<TextBox
x:Name="txtOutOrderBuyer"
d:Text="张三"
Background="Transparent"
BorderThickness="0"
Cursor="Hand"
Foreground="#AA0000FF"
IsReadOnly="True"
Tag="{Binding OutBuyerId}"
Text="{Binding OutBuyerName}"
TextWrapping="Wrap" />
<Border
x:Name="borderTransitBuyerRefundStatus"
Height="auto"
MinWidth="30"
Margin="2,0,0,0"
HorizontalAlignment="Center"
d:Background="{StaticResource PageOkBrush}"
d:BorderBrush="{StaticResource PageOkBrush}"
Background="{Binding TransitDetailRefundStatusBackColor}"
BorderBrush="{Binding TransitDetailRefundStatusBackColor}"
BorderThickness="1"
CornerRadius="2"
Visibility="{Binding TransitDetailRefundStatusStrVisibility}">
<TextBlock
x:Name="txtRefundStatus"
MinWidth="20"
Padding="0"
VerticalAlignment="Center"
d:Text="退货成功"
Background="Transparent"
Foreground="White"
Text="{Binding TransitDetailRefundStatusStr}" />
</Border>
</WrapPanel>
</wpf:TitleContent>
<wpf:TitleContent Title="采购单号:" Foreground="#FF666666">
<TextBox
x:Name="txtOutOrderId"
d:Text="261008-1234567890123456"
Background="Transparent"
BorderThickness="0"
Cursor="Hand"
Foreground="#AA0000FF"
IsReadOnly="True"
Text="{Binding OutOrderId}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="下单时间:" Foreground="#FF666666">
<TextBox
d:Text="26-10-07 10:33:33"
Background="Transparent"
BorderThickness="0"
Foreground="#FF888888"
IsReadOnly="True"
Text="{Binding WxOrderCreateTimeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="添加时间:" Foreground="#FF666666">
<TextBox
d:Text="26-10-07 18:33:33"
Background="Transparent"
BorderThickness="0"
Foreground="#FF888888"
IsReadOnly="True"
Text="{Binding TransitAddTimeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="创建时间:" Foreground="#FF666666">
<TextBox
d:Text="26-10-08 00:33:33"
Background="Transparent"
BorderThickness="0"
Foreground="#FF888888"
IsReadOnly="True"
Text="{Binding CreateTimeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<!--<wpf:TitleContent Title="店铺名称:">
<TextBox
d:Text="芥麦亚"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding ShopName}"
TextWrapping="Wrap" />
</wpf:TitleContent>-->
</wpf:SpacingStackPanel>
</Border>
<Border
Grid.Column="1"
Margin="0,10"
BorderBrush="LightSkyBlue"
BorderThickness="0,0,1,0"
Opacity="0.5">
<wpf:SpacingStackPanel
Margin="10,10"
VerticalAlignment="Center"
Orientation="Vertical"
VerticalSpacing="4">
<wpf:TitleContent
Title="{Binding WarehouseName}"
d:Title="上海仓"
FontWeight="Bold">
<WrapPanel>
<TextBox
d:Text="已出仓"
Background="Transparent"
BorderThickness="0"
FontWeight="Normal"
IsReadOnly="True"
Text="{Binding WarehouseStatus}"
TextWrapping="Wrap" />
</WrapPanel>
</wpf:TitleContent>
<wpf:TitleContent Title="入库单号:">
<TextBox
d:Text="JTSD-JT12345678901122"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding UpperWaybill}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="出库单号:">
<TextBox
d:Text="YD-3111111555555123"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding DownWaybill}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="货架号:">
<TextBox
d:Text="EB3021"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding ShelfCodeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="货架记录时间:">
<TextBox
d:Text="26-10-08 00:33:33"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding ShelfTimeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
</Border>
<Border
Grid.Column="2"
Margin="0,10"
BorderBrush="LightSkyBlue"
BorderThickness="0,0,1,0"
Opacity="0.5">
<wpf:SpacingStackPanel
Margin="10,10"
VerticalAlignment="Center"
Orientation="Vertical"
VerticalSpacing="4">
<wpf:TitleContent Title="作废状态:" FontWeight="Bold">
<TextBox
d:Text="已作废"
Background="Transparent"
BorderThickness="0"
FontWeight="Normal"
IsReadOnly="True"
Text="{Binding TransitVoidStatus}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="拒收状态:" FontWeight="Bold">
<TextBox
d:Text="拒收失败"
Background="Transparent"
BorderThickness="0"
FontWeight="Normal"
IsReadOnly="True"
Text="{Binding TransitRejectStatus}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="拦截状态:" FontWeight="Bold">
<TextBox
d:Text="已拦截"
Background="Transparent"
BorderThickness="0"
FontWeight="Normal"
IsReadOnly="True"
Text="{Binding TransitReturnStatus}"
TextWrapping="Wrap" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
</Border>
<Border
Grid.Column="3"
Margin="0,10"
BorderBrush="LightSkyBlue"
BorderThickness="0,0,1,0"
Opacity="0.5">
<wpf:SpacingStackPanel
Margin="10,10"
VerticalAlignment="Center"
Orientation="Vertical"
VerticalSpacing="4">
<wpf:TitleContent Title="到仓时间:">
<TextBox
d:Text="26-10-07 10:33:33"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding InboundTimeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="取号时间:">
<TextBox
d:Text="26-10-08 00:33:33"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding PickUpTimeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
<wpf:TitleContent Title="出仓时间:">
<TextBox
d:Text="26-10-07 10:33:33"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding OutboundTimeStr}"
TextWrapping="Wrap" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
</Border>
<Border Grid.Column="4">
<wpf:SpacingStackPanel
Grid.Column="8"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Vertical"
VerticalSpacing="5">
<Button
x:Name="btnVoidPackage"
MinWidth="38"
MinHeight="20"
Margin="0,0,0,0"
Padding="2"
HorizontalAlignment="Center"
d:Visibility="Visible"
Click="btnVoidPackage_Click"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="{Binding VoidPackageBtnVisibility}">
作废包裹
</Button>
<Button
x:Name="btnAddEditTransitWarehouseReject_New"
MinWidth="38"
MinHeight="20"
Margin="0,0,0,0"
Padding="2"
HorizontalAlignment="Center"
d:Visibility="Visible"
Click="btnAddEditTransitWarehouseReject_Click"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="{Binding RejectPackageBtnVisibility}">
<!--<TextBlock>
云仓拒收<LineBreak />
退回总店</TextBlock>-->
云仓拒收退回总店
</Button>
<Button
x:Name="btnAddEditTransitWarehouseAfterSale_n1"
MinWidth="38"
MinHeight="20"
Margin="0,0,0,0"
Padding="2"
Click="btnAddEditTransitWarehouseAfterSale_Click"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="{Binding ReturnPackageBtnVisibility}">
拒收失败转寄总店
</Button>
<Button
x:Name="btnAddEditTransitWarehouseAfterSale_n2"
MinWidth="38"
MinHeight="20"
Margin="0,0,0,0"
Padding="2"
Click="btnAddEditTransitWarehouseAfterSale_Click"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="{Binding InterceptPackageBtnVisibility}">
出库拦截退回仓库
</Button>
<Button
x:Name="btnTransitExtraPackages"
Height="20"
MinWidth="38"
Margin="0,0,0,0"
Padding="2"
HorizontalAlignment="Center"
d:Visibility="Visible"
Click="btnTransitExtraPackages_Click"
Content="滞留补发买家"
FontSize="11"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="{Binding ExtraPackagesBtnVisibility}" />
</wpf:SpacingStackPanel>
</Border>
</Grid>
</Grid>
</Border>
</UserControl>
@@ -0,0 +1,246 @@
using _29WxOrderWpf.BaseWindows;
using _29WxOrderWpf.Views;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using NaiBa.Util.Extension;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Work;
using Work._29Tools.BLL;
using WxOrder.Framework.Commons;
namespace _29WxOrderWpf.Ctrls.OrderCtrls;
/// <summary>
/// OrderTransitListDetailCtrl.xaml 的交互逻辑
/// </summary>
public partial class OrderTransitListDetailCtrl : UserControl
{
public OrderTransitListDetailCtrl()
{
InitializeComponent();
this.txtOutOrderId.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtOutOrderId_MouseLeftButtonUp), true);
this.txtOutOrderBuyer.AddHandler(TextBox.MouseUpEvent, new MouseButtonEventHandler(txtOutOrderId_MouseLeftButtonUp), true);
}
/// <summary> 作废包裹 </summary>
private async void btnVoidPackage_Click(object sender, RoutedEventArgs e)
{
if (this.DataContext is oms_wei_order_item_transit_detail_info transitDetailInfo)
{
btnVoidPackage.IsEnabled = false;
var orderItem = transitDetailInfo.oms_wei_order_item_info;
var transitOrder = transitDetailInfo.oms_wei_external_procurement_log_info;
var returnOrder = transitDetailInfo.oms_wei_external_procurement_after_sale_info;
var extOrder = transitDetailInfo.oms_wei_transfer_extra_package;
// 作废发货包裹
if (transitOrder != null)
{
transitOrder = orderItem.ItemTransitOrders.FirstOrDefault(t => t.order_code == transitOrder.order_code) ?? transitOrder;
await OrderTransitService.VoidOrder(orderItem, transitOrder);
}
// 作废退货包裹
else if (returnOrder != null)
{
try
{
var voidResult = await OrderTransitService.VoidAfterSalePackage(orderItem, returnOrder);
if (!string.IsNullOrEmpty(voidResult))
BaseMsgWindow.ShowInfo(voidResult);
}
catch (Exception ex)
{
BaseMsgWindow.ShowError(ex.Message);
}
}
// 作废额外包裹
else if (extOrder != null)
{
try
{
var voidResult = await OrderTransitService.VoidExtraPackage(orderItem, extOrder);
if (!string.IsNullOrEmpty(voidResult))
BaseMsgWindow.ShowInfo(voidResult);
}
catch (Exception ex)
{
BaseMsgWindow.ShowError(ex.Message);
}
}
RefreshListCtrl(orderItem);
btnVoidPackage.IsEnabled = true;
}
}
/// <summary> 拒收包裹 </summary>
private async void btnAddEditTransitWarehouseReject_Click(object sender, RoutedEventArgs e)
{
if (this.DataContext is oms_wei_order_item_transit_detail_info transitDetailInfo)
{
btnAddEditTransitWarehouseReject_New.IsEnabled = false;
var orderItem = transitDetailInfo.oms_wei_order_item_info;
var transitOrder = transitDetailInfo.oms_wei_external_procurement_log_info;
var returnOrder = transitDetailInfo.oms_wei_external_procurement_after_sale_info;
var extOrder = transitDetailInfo.oms_wei_transfer_extra_package;
// 拒收发货包裹
if (transitOrder != null)
{
try
{
var rejectRst = await OrderTransitService.RejectTransitOrder(orderItem, transitOrder);
if (!string.IsNullOrEmpty(rejectRst))
BaseMsgWindow.ShowInfo(rejectRst);
}
catch (Exception ex)
{
BaseMsgWindow.ShowError(ex.Message);
}
}
// 拒收额外包裹(额外包裹暂不支持多件商品发货,故暂不存在拒收功能)
else if (extOrder != null)
{
}
RefreshListCtrl(orderItem);
btnAddEditTransitWarehouseReject_New.IsEnabled = true;
}
}
private void btnAddEditTransitWarehouseAfterSale_Click(object sender, RoutedEventArgs e)
{
if (this.DataContext is oms_wei_order_item_transit_detail_info transitDetailInfo)
{
btnAddEditTransitWarehouseAfterSale_n1.IsEnabled = false;
btnAddEditTransitWarehouseAfterSale_n2.IsEnabled = false;
var orderItem = transitDetailInfo.oms_wei_order_item_info;
var transitOrder = transitDetailInfo.oms_wei_external_procurement_log_info;
var returnOrder = transitDetailInfo.oms_wei_external_procurement_after_sale_info;
var extOrder = transitDetailInfo.oms_wei_transfer_extra_package;
if (transitOrder != null)
{
bool isOutWarehouse = sender == btnAddEditTransitWarehouseAfterSale_n2;
OrderListRowItemCtrl.ShowReturnPackageWindow(orderItem, transitDetailInfo, isOutWarehouse);
}
else if (extOrder != null)
{
bool isOutWarehouse = sender == btnAddEditTransitWarehouseAfterSale_n2;
OrderListRowItemCtrl.ShowReturnPackageWindow(orderItem, transitDetailInfo, isOutWarehouse);
}
RefreshListCtrl(orderItem);
btnAddEditTransitWarehouseAfterSale_n1.IsEnabled = true;
btnAddEditTransitWarehouseAfterSale_n2.IsEnabled = true;
}
}
private void btnTransitExtraPackages_Click(object sender, RoutedEventArgs e)
{
// 滞留补发买家(补发包裹)
if (this.DataContext is oms_wei_order_item_transit_detail_info transitDetailInfo)
{
var orderItem = transitDetailInfo.oms_wei_order_item_info;
var transitOrder = transitDetailInfo.oms_wei_external_procurement_log_info;
var returnOrder = transitDetailInfo.oms_wei_external_procurement_after_sale_info;
var extOrder = transitDetailInfo.oms_wei_transfer_extra_package;
if (transitOrder != null)
{
// 不是中转仓,直接返回
if (transitOrder == null)
{
BaseMsgWindow.ShowError("非中转仓订单不支持补发!");
return;
}
TransitExtraPackagesView transitExtraPackagesView = new TransitExtraPackagesView(orderItem.ItemOrder, orderItem, transitOrder);
new DialogWindow()
{
Title = "滞留补发买家",
Content = transitExtraPackagesView,
}.ShowDialog();
}
RefreshListCtrl(orderItem);
}
}
public void RefreshListCtrl(oms_wei_order_item_info orderItem)
{
// 更新列表
if (FindParent<OrderTransitListCtrl>(this) is OrderTransitListCtrl transitListCtrl)
{
oms_wei_order_item_transit_model transitInfo = new oms_wei_order_item_transit_model()
{
OrderItem = GlobalConfig.lstOrder.FirstOrDefault(o => o.order_id == orderItem?.order_id)?.orderItems.FirstOrDefault(oi => oi.sku_id == orderItem?.sku_id),
};
transitListCtrl.UpdateViewModel(transitInfo);
}
}
/// <summary>
/// 查找指定类型的父级控件
/// </summary>
/// <typeparam name="T">目标父控件类型</typeparam>
/// <param name="child">起始子控件</param>
/// <returns>找到的父控件,未找到则返回 null</returns>
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
if (parentObject == null) return null;
if (parentObject is T parent)
{
return parent;
}
else
{
// 递归继续向上查找
return FindParent<T>(parentObject);
}
}
private void txtOutOrderId_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (this.DataContext is oms_wei_order_item_transit_detail_info transitDetailInfo && transitDetailInfo.oms_wei_order_item_info is oms_wei_order_item_info orderItem)
{
var buyerId = txtOutOrderBuyer.Tag as string;
var buyerName = txtOutOrderBuyer.Text;
var outOrderId = txtOutOrderId.Text;
if (string.IsNullOrEmpty(buyerName) || string.IsNullOrEmpty(outOrderId))
{
return;
}
bool isShowOrderList = sender == txtOutOrderBuyer;
OrderBuyerOrdersHelper.ShowBuyerOrder(orderItem, buyerId, buyerName, outOrderId, isShowOrderList);
}
}
}
@@ -0,0 +1,351 @@
using _29WxOrderWpf.BaseWindows;
using _29WxOrderWpf.Ctrls.BuyerCtrls;
using _29WxOrderWpf.ViewModels;
using _29WxOrderWpf.Views;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using AllBase.Model.Result;
using NaiBa.Util.Extension;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Work;
using Work._29Tools.BLL;
using WxOrder.Framework.Commons;
namespace _29WxOrderWpf.Ctrls.OrderCtrls;
internal class OrderTransitService
{
/// <summary>
/// 作废中转仓发货包裹
/// </summary>
/// <param name="orderItem"></param>
/// <param name="isSilent"></param>
/// <param name="UpdateOrderBeforeVoid">作废前是否更新服务端订单状态</param>
public static async Task VoidOrder(oms_wei_order_item_info orderItem, oms_wei_external_procurement_log_info transitOrder = null, bool isSilent = false, bool UpdateOrderBeforeVoid = true)
{
if (!isSilent)
{
if (BaseMsgWindow.ShowConfirm("确定作废当前包裹吗?").DialogResult == false)
return;
}
// 作废前查询订单状态
var orderId = orderItem.order_id;
var skuId = orderItem.sku_id;
if (UpdateOrderBeforeVoid)
await Task.Run(async() => { await MainWindow.Instance.orderListCtrl.GetOrder(orderId); });
var newOrder = GlobalConfig.lstOrder.FirstOrDefault(or => or.order_id == orderId);
if (newOrder?.orderItems.Count == 1)
orderItem = newOrder?.orderItems?.FirstOrDefault();
else
orderItem = newOrder?.orderItems?.FirstOrDefault(oi => oi.sku_id == skuId);
if (orderItem == null)
{
if (!isSilent)
BaseMsgWindow.ShowError("订单查询失败,请重试");
return;
}
if (transitOrder == null)
transitOrder = orderItem.ItemTransitOrder ?? orderItem.ItemTransitOrderWithVoid;
if (transitOrder == null)
{
if (!isSilent)
BaseMsgWindow.ShowError("要作废的中转订单不存在,请确认后重试");
return;
}
// 先作废后申请买手退款
// 订单作废接口(作废重拍)
//postman request POST 'http://localhost:8088/oms-api/external_procurement/discardOrder' \
// --header 'Content-Type: application/json' \
// --body '{
// "orderNo":"12334534534",
// "outOrderNo":"12312312"
//}' 成功返回code:0 失败返回code:1
string url2 = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/discardOrder";
var data2 = new JObject();
data2["orderNo"] = orderItem.order_id;
//data2["outOrderNo"] = transitOrder.out_order_no;
data2["outOrderNo"] = transitOrder.order_code;
var dataStr2 = JsonHelper.SerializeObject(data2);
var discardRst = await HttpResponseWXBLL.e57PostResponseAsync(url2, dataStr2);
if (discardRst.Contains("\"code\":0") || discardRst.Contains("\"code\":200"))
{
//MainWindow.Instance.orderListCtrl.GetOrder(orderId);
// 修改为在买手退款流程后提示作废信息
}
else
{
var msg = BaseRegex.GetStringJson(ref discardRst, "msg");
if (!isSilent)
BaseMsgWindow.ShowInfo("订单作废失败,服务端返回 " + msg);
return;
}
#region 处理买手售后
if (transitOrder.out_order_no.ParseToString().StartsWith("tb_")) // 淘宝买手售后
{
if (!isSilent)
BaseMsgWindow.ShowError("淘宝买手暂不支持自动售后,作废后请手动申请售后");
else
transitOrder.refund_status = "淘宝买手暂不支持自动售后,作废后需手动申请售后";
}
else // 拼多多买手售后
{
bool noBuyer = false;
var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(b => b.buyer_id == transitOrder.buyer_account || b.buyer_name == transitOrder.buyer_account);
if (buyer == null)
{
if (!isSilent)
if (BaseMsgWindow.ShowConfirm("拍单买手不存在,点击确定直接作废中转单并手动取消买手单,点击取消登录买手后重试").DialogResult != true)
return;
noBuyer = true;
}
// 检测一下买手号
if (GlobalConfig.CurrentPddBuyer.status == "在线")
{
await Task.Run(() =>
{
PddMobileLoginViewModel.CheckBuyerLogin(GlobalConfig.CurrentPddBuyer);
});
}
if (GlobalConfig.CurrentPddBuyer.status != "在线")
{
if (!isSilent)
if (BaseMsgWindow.ShowConfirm("买手号掉线,点击确定直接作废中转单并手动取消买手单,点击取消登录买手后重试").DialogResult != true)
return;
noBuyer = true;
}
if (!noBuyer)
{
PddBuyerOrderLiteInfo order = null;
order = PDDBuyerOrderReadCtrl.lstPddBuyerOrderInfoLite.FirstOrDefault(o => o.order_sn == transitOrder.out_order_no);
if (order == null)
order = new PddBuyerOrderLiteInfo()
{
order_status_prompt = "待发货",
order_amount = transitOrder.out_amount,
order_sn = transitOrder.out_order_no
};
PDDBuyerOrderReadCtrl.lstPddBuyerOrderInfoLite.Add(order);
var pddAfterRst = "";
await Task.Run(() =>
{
pddAfterRst = PDDBuyerOrderReadCtrl.SimPddAfterSale(buyer, order);
});
if (pddAfterRst.Contains("\"after_sales_status\":1") || pddAfterRst.Contains("该订单已全额退款") || pddAfterRst.Contains("订单未付款"))
{
// 保存退款成功状态
order.order_status_prompt = pddAfterRst.Contains("订单未付款") ? "订单未付款" : "退款成功";
// 中转仓订单买手号售后信息 存到服务端
var refundRst = PDDBuyerOrderReadCtrl.SendTransitAfterSaleE57(order);
if (refundRst.Contains("<code>0</code>") || refundRst.Contains("<code>200</code>"))
{
order.sendStatus = "退款成功 买手退款信息更新成功";
}
else
{
var msg = BaseRegex.GetStringXml(ref refundRst, "msg");
order.sendStatus = "退款成功 买手退款信息更新失败,服务端返回 " + msg;
}
NaiBa.Util.Helper.ConfigHelper.SaveConfig("pdd_buyer_order_list", PDDBuyerOrderReadCtrl.lstPddBuyerOrderInfoLite);
}
else
{
if (!isSilent)
if (BaseMsgWindow.ShowConfirm("买手退款失败,点击确定直接作废中转单并手动取消买手单,点击取消稍候重试").DialogResult != true)
return;
}
}
}
#endregion
#region 更新拍单余额
StartUp.UpdateBalance();
#endregion
#region 立即更新订单
transitOrder = orderItem.ItemTransitOrders.FirstOrDefault(o => o.order_code == transitOrder.order_code) ?? transitOrder;
transitOrder.order_void_status = 1;
orderItem.SetOrderItemTextProperty();
#endregion
#region 重新过滤订单
OrderListCtrl.InitOrderItemObservableProp(orderItem);
MainWindow.Instance.orderListCtrl.FilterOrders();
if (!isSilent)
BaseMsgWindow.ShowInfo("订单作废成功,请重新拍单");
#endregion
}
/// <summary>
/// 作废售后包裹
/// </summary>
/// <param name="returnOrder"></param>
/// <returns></returns>
public static async Task<string> VoidAfterSalePackage(oms_wei_order_item_info orderItem, oms_wei_external_procurement_after_sale_info returnOrder)
{
string typeStr = returnOrder?.pack_type == 1 ? "作废分销发货退货包裹" : "作废额外包裹退货包裹";
string msg = $@"确定{typeStr}吗?";
if (BaseMsgWindow.ShowConfirm(msg, typeStr, null, MsgWindowLevel.MEDIUM, 300).DialogResult != true)
return "";
string url2 = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/orders/interceptReturn";
var data = new JObject();
data["externalOrderNo"] = returnOrder.external_order_no;
data["orderNo"] = returnOrder.order_no; // 订单编号
data["orderCode"] = returnOrder.order_code;
data["packType"] = returnOrder.pack_type; /* 1作废分销发货退货包裹 2作废额外包裹退货包裹 */
var dataStr2 = JsonHelper.SerializeObject(data);
var voidRst = await HttpResponseWXBLL.e57PostResponseAsync(url2, dataStr2);
if (voidRst.Contains("\"code\":0") || voidRst.Contains("\"code\":200"))
{
StartUp.UpdateBalance();
returnOrder.order_void_status = 1;
orderItem.SetOrderItemTextProperty();
return typeStr + "成功!";
}
else
{
throw new Exception(typeStr + "失败,服务端返回:" + BaseRegex.GetStringJsonByRegs(ref voidRst, voidRst, "msg"));
}
}
/// <summary>
/// 作废额外包裹
/// </summary>
/// <param name="orderItem"></param>
/// <param name="extraOrder"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static async Task<string> VoidExtraPackage(oms_wei_order_item_info orderItem, oms_wei_transfer_extra_package extraOrder)
{
string typeStr = "作废额外包裹";
string msg = $@"确定{typeStr}吗?";
if (BaseMsgWindow.ShowConfirm(msg, typeStr, null, MsgWindowLevel.MEDIUM, 300).DialogResult != true)
return "";
var data = new JObject();
data["batchId"] = extraOrder.batchId;
data["orderCode"] = extraOrder.order_code;
var dataStr = JsonHelper.SerializeObject(data);
var url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/extraOrders/void";
var voidRst = await HttpResponseWXBLL.e57PostResponseAsync(url, dataStr);
if (BaseRegex.GetStringJson(ref voidRst, "code") != "0" && BaseRegex.GetStringJson(ref voidRst, "code") != "200")
{
throw new Exception("作废额外包裹失败,服务端返回:" + BaseRegex.GetStringJsonByRegs(ref voidRst, voidRst, "msg"));
}
StartUp.UpdateBalance();
extraOrder.order_void_status = 1;
orderItem.SetOrderItemTextProperty();
//MainWindow.Instance.orderListCtrl.FilterOneOrder(orderItem.order_id);
return "作废额外包裹成功!";
}
/// <summary>
/// 云仓申请拒收退回总店
/// </summary>
/// <param name="orderItem"></param>
public static async Task<string> RejectTransitOrder(oms_wei_order_item_info orderItem, oms_wei_external_procurement_log_info _itemTransitOrder)
{
string msg = $@"
        云仓拒收退回总店
说  明:店铺产生售后,拒收成功,货物会原物流退回总店。
拒收条件:(总店物流没到云仓/未签收前)。顺丰/京东无法
     拒收,直接总店申请仅退款让总店拦截。
收  费:免费";
if (BaseMsgWindow.ShowConfirm(msg, "云仓拒收退回总店", null, MsgWindowLevel.LARGE, 300).DialogResult != true)
return "";
orderItem.ItemTransitOrders = OrderListCtrl.GetTransitWarehouseList(orderItem.order_id);
orderItem.PddBuyerOrders = OrderListCtrl.GetPddBuyerOrders(orderItem.order_id).Where(o => o.wx_send_type == 0).ToList();
orderItem.PddBuyerOrders.AddRange(OrderListCtrl.GetTbBuyerOrders(orderItem.order_id).Where(o => o.wx_send_type == 0).ToList());
OrderListCtrl.InitOrderItemObservableProp(orderItem);
var itemTransitOrder = orderItem.ItemTransitOrders.FirstOrDefault(o => o.order_code == _itemTransitOrder?.order_code && o.out_order_no == _itemTransitOrder?.out_order_no);
if (itemTransitOrder == null)
itemTransitOrder = _itemTransitOrder;
//if (itemTransitOrder?.warehouse_status == 3) { BaseMsgWindow.ShowError("商品已拒收或拦截!"); return; }
//if (itemTransitOrder?.warehouse_status == 2) { BaseMsgWindow.ShowError("商品已出库,请选择退回中转仓!"); return; }
//if (string.IsNullOrEmpty(orderItem.PddBuyerOrder?.order_sn)) { BaseMsgWindow.ShowError("商品未出单,请直接去拼多多买手申请退款"); return; }
if (itemTransitOrder?.has_reject == 1 || itemTransitOrder?.has_reject == 3)
{
//BaseMsgWindow.ShowAnimateMessage("已申请拒收", "Msg", 3);
return "已申请过拒收";
}
// 中转仓拒收(已产生物流)
string url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/orders/rejectApply";
var dataObj = new JObject();
dataObj["orderCode"] = itemTransitOrder?.order_code;
dataObj["orderId"] = orderItem.order_id;
dataObj["logisticsExpressCode"] = orderItem.PddBuyerOrder?.order_sn;
var data = JsonHelper.SerializeObject(dataObj);
var html = HttpResponseWXBLL.e57PostResponse(url, data, "");
int rejectStatus = 0;
if (html.Contains("<code>0</code>") || html.Contains("<code>200</code>"))
{
rejectStatus = 1;
//BaseMsgWindow.ShowAnimateMessage("申请成功", "Msg", 3);
}
else
{
rejectStatus = 2;
var err = BaseRegex.GetStringXmlByRegs(ref html, html, "msg");
//BaseMsgWindow.ShowAnimateMessage("申请失败", "Error", 3);
throw new Exception("申请失败" + err);
}
url = BaseClass.Build29WxObjString("order/wx_update_transit_order_reject_status");
data = UserLogin.GetSignaturex();
data += "&order_no=" + orderItem.order_id;
data += "&order_sku_id=" + orderItem.sku_id;
data += "&has_reject=" + rejectStatus;
html = await GetHtml.PostUtf8Async(url, data);
itemTransitOrder.has_reject = rejectStatus;
OrderListCtrl.InitOrderItemObservableProp(orderItem);
return "申请成功";
}
/// <summary>
/// 申请拒收后查询拒收状态
/// </summary>
/// <param name="orderItem"></param>
/// <param name="upperWaybill"></param>
public static void ShowRejectTransitOrder(oms_wei_order_item_info orderItem, string upperWaybill)
{
BaiduGetWaybillInfoView buyerLoginForm = new BaiduGetWaybillInfoView(orderItem);
buyerLoginForm.ViewModel.InitUrl = "https://www.baidu.com/s?ie=UTF-8&wd=" + upperWaybill;
new DialogWindow()
{
Width = 1280,
Height = 800,
Title = "物流拒收查询",
Content = buyerLoginForm,
}.Show();
return;
}
}
@@ -0,0 +1,140 @@
// 填写信息
function changeReactInputValue(inputDom, newText) {
let lastValue = inputDom.value;
inputDom.value = newText;
let event = new Event('input', { bubbles: true });
event.simulated = true;
let tracker = inputDom._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
inputDom.dispatchEvent(event);
}
// 异步 sleep
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// 查找元素(支持选择器或XPath)
function findElement(selector, isXPath = true) {
if (isXPath) {
return document.evaluate(
selector,
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
} else {
return document.querySelector(selector);
}
}
// 完整流程
async function changeTbAddress(data = {}) {
const {
transitAddress = ''
} = data;
console.log('📝 开始自动填写地址...');
// 1. 点击"修改"按钮,弹出修改地址框
var btnType = findElement('(//a[contains(text(), "修改")])[1]');
for (i = 0; i < 10; i++) {
if (!btnType) {
console.warn('⚠️ 找不到"修改"按钮,等待重试' + i);
await sleep(500);
btnType = findElement('(//a[contains(text(), "修改")])[1]');
}
}
if (!btnType) {
console.warn('⚠️ 找不到"修改"按钮');
return false;
}
btnType.click();
console.log('✅ 已点击"修改"按钮');
await sleep(500);
return true;
// // 2. 填充并自动识别收货地址
// const invoiceTitle = findElement('//label[contains(text(), "发票抬头")]/following-sibling::textarea[1]') ||
// findElement('//*[contains(text(), "发票抬头")]/following-sibling::textarea[1]');
// if (invoiceTitle) {
// changeReactInputValue(invoiceTitle, title);
// console.log('✅ 发票抬头已填充');
// } else {
// console.warn('⚠️ 未找到发票抬头控件');
// }
// // 3. 查找并填充税号
// const taxNumberInput = findElement('//label[contains(text(), "税号")]/following-sibling::input[1]') ||
// findElement('//*[contains(text(), "税号")]/following-sibling::input[1]');
// if (taxNumberInput) {
// changeReactInputValue(taxNumberInput, taxNumber);
// console.log('✅ 税号已填充');
// } else {
// console.warn('⚠️ 未找到税号控件');
// }
// await sleep(300);
// // 4. 查找并点击"申请发票"按钮
// const applyBtn = findElement('//*[contains(text(), "申请发票")]');
// if (!applyBtn) {
// console.error('❌ 未找到"申请发票"按钮');
// return false;
// }
// applyBtn.scrollIntoView({ behavior: 'smooth', block: 'center' });
// await sleep(300);
// applyBtn.click();
// console.log('✅ 已点击"申请发票"按钮');
// // 5. 等待弹窗/状态出现
// await sleep(300);
// // 6. 判断状态
// // 检查是否有"已经申请过"的提示
// const alreadyApplied = findElement('//*[contains(text(), "您已经提交过发票申请了")]')
// if (alreadyApplied) {
// console.log('✅ 已经申请过,无需重复操作');
// return true;
// }
// const successElement = findElement('//*[text()="确认发票信息无误后再提交"]');
// if (successElement == null) {
// return false;
// }
// // 检查是否有"确认开具"按钮或提示
// const confirmBtn = findElement('//*[text()= "确认"]');
// if (confirmBtn) {
// console.log('✅ 找到"确认"按钮,准备点击...');
// await sleep(200);
// confirmBtn.click();
// console.log('✅ 已点击"确认"按钮');
// return true;
// }
// // 如果都没有找到
// console.warn('⚠️ 未找到"已经申请过"或"确认"按钮,请手动检查');
// return false;
}
// ========== 调用 ==========
(async function () {
try {
const result = await changeTbAddress({
transitAddress: '{中转仓地址}'
});
console.log('执行结果:', result);
// 批量开票时,C# 端轮询该变量获取执行结果
window.__invoiceApplyResult = result;
} catch (ex) {
console.error('执行异常:', ex);
window.__invoiceApplyResult = false;
}
})();
@@ -0,0 +1,87 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.PDDInvoice.PDDInvoiceDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.PDDInvoice"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wpf="WPFCommon"
Width="400"
Height="250"
d:Background="White"
d:DataContext="{d:DesignInstance Type=local:PDDInvoiceDialog}"
mc:Ignorable="d">
<UserControl.Resources>
<Style BasedOn="{StaticResource TitleContentBaseStyle}" TargetType="wpf:TitleContent">
<Setter Property="Placement" Value="Left" />
<Setter Property="Height" Value="28" />
<Setter Property="TitleVerticalAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="TitleHorizontalAlignment" Value="Right" />
<Setter Property="TitleWidth" Value="50" />
<Style.Resources>
<Style TargetType="TextBox">
<Setter Property="Height" Value="28" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
</Style.Resources>
</Style>
</UserControl.Resources>
<Border
Margin="10"
Padding="5"
BorderBrush="Gray"
BorderThickness="1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<wpf:SpacingStackPanel
Grid.Row="0"
Orientation="Vertical"
VerticalSpacing="10">
<wpf:TitleContent Title="公司:">
<TextBox d:Text="嵩县雷神商贸有限责任公司" Text="{Binding Config.Title}" />
</wpf:TitleContent>
<wpf:TitleContent Title="税号:">
<TextBox d:Text="91410325MADQERT68E" Text="{Binding Config.TaxNo}" />
</wpf:TitleContent>
<wpf:TitleContent Title="最大金额:">
<wpf:NumberBox
Width="80"
HorizontalAlignment="Left"
Maximum="999999"
Minimum="0"
Value="{Binding Config.MaxAmount}" />
</wpf:TitleContent>
<wpf:TitleContent Title="数据保存:">
<CheckBox IsChecked="{Binding Config.IsSaveData}" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
<Border
Grid.Row="1"
Margin="-5"
Padding="0,5"
BorderBrush="Gray"
BorderThickness="0,1,0,0">
<wpf:SpacingStackPanel HorizontalAlignment="Center" HorizontalSpacing="30">
<Button
Padding="10,5"
Command="{Binding ConfirmCommand}"
Content="确定"
Style="{StaticResource BasePageButtonStyle}" />
<Button
Padding="10,5"
Command="{Binding CancelCommand}"
Content="取消"
Style="{StaticResource BasePageButtonLightStyle}" />
</wpf:SpacingStackPanel>
</Border>
</Grid>
</Border>
</UserControl>
@@ -0,0 +1,87 @@
using WxOrder.Framework.Commons;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WPFCommon.Models;
using WxOrder.Framework.Commons.Dialogs;
using static Org.BouncyCastle.Math.EC.ECCurve;
namespace _29WxOrderWpf.Ctrls.PDDInvoice;
/// <summary>
/// PDDInvoiceDialog.xaml 的交互逻辑
/// </summary>
public partial class PDDInvoiceDialog : UserControl, IDialogAware
{
public PDDInvoiceDialog(InvoiceConfig config)
{
InitializeComponent();
DataContext = this;
Config = new InvoiceConfig();
Config.Assign(config);
}
public string Title { get; set; }
public event Action<IDialogResult> RequestClose;
private void PDDInvoiceDialog_Loaded(object sender, RoutedEventArgs e)
{
}
public void OnDialogOpened(IDialogParameters parameters)
{
Title = "设置";
}
private void ViewModel_RequestClose()
{
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
parentWindow.Close();
}
public InvoiceConfig Config { get; }
public ICommand ConfirmCommand => new DelegateCommand(Confirm);
private void Confirm()
{
RequestClose?.Invoke(new DialogResult(ButtonResult.OK, new DialogParameters
{
{ "config",Config}
}));
}
public ICommand CancelCommand => new DelegateCommand(Cancel);
private void Cancel()
{
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
}
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
}
}
+109 -98
View File
@@ -2,29 +2,29 @@
x:Class="_29WxOrderWpf.Ctrls.PDDInvoice.PDDInvoiceView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:comm="clr-namespace:_29WxOrderWpf.Common"
xmlns:common="clr-namespace:_29WxOrderWpf.Common"
xmlns:comm="WxOrder.Framework"
xmlns:common="WxOrder.Framework"
xmlns:converters="clr-namespace:_29WxOrderWpf.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:_29WxOrderWpf.Ctrls.PDDInvoice.ViewModels"
xmlns:wpf="clr-namespace:WPFCommon.Controls;assembly=WPFCommon"
comm:DialogWindowProperty.ResizeMode="CanResizeWithGrip"
comm:DialogWindowProperty.ShowMinButton="False"
comm:DialogWindowProperty.ShowMinButton="True"
common:DialogWindowProperty.Height="720"
common:DialogWindowProperty.Width="1260"
d:DataContext="{d:DesignInstance Type=vm:PDDInvoiceViewModel,
IsDesignTimeCreatable=True}"
d:DesignHeight="720"
d:DesignWidth="1260"
d:DesignWidth="1960"
Background="White"
mc:Ignorable="d">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
<converters:ImageUrlToBitmapImageConverter x:Key="ImageUrlToBitmapImage" />
<converters:ImageUrlToBitmapImageConverter x:Key="ImageUrlToBitmapImageConverter" />
<converters:InverseVisibleToVisibilityConverter x:Key="InverseBooleanToVisibility" />
<converters:ImageLoadRequestConverter x:Key="ImageLoadRequestConverter" />
<!-- 原型配色 -->
<SolidColorBrush x:Key="PageBgBrush" Color="#F5F6F8" />
<SolidColorBrush x:Key="CardBgBrush" Color="#FFFFFF" />
@@ -50,7 +50,7 @@
<!-- 搜索 / 表单输入框 -->
<Style x:Key="SearchTextBoxStyle" TargetType="TextBox">
<Setter Property="Height" Value="36" />
<Setter Property="Height" Value="30" />
<Setter Property="Padding" Value="12,0" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="FontSize" Value="13" />
@@ -81,76 +81,9 @@
</Setter.Value>
</Setter>
</Style>
<!-- 主按钮 -->
<Style x:Key="PrimaryButtonStyle" TargetType="Button">
<Setter Property="Height" Value="36" />
<Setter Property="Padding" Value="18,0" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Background" Value="{StaticResource PrimaryBrush}" />
<Setter Property="FontSize" Value="13" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
x:Name="border"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
CornerRadius="4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="{StaticResource PrimaryHoverBrush}" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Opacity" Value="0.8" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Opacity" Value="0.5" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style BasedOn="{StaticResource BasePageButtonStyle}" TargetType="Button">
<Setter Property="Height" Value="30" />
</Style>
<!-- 默认按钮 -->
<Style x:Key="DefaultButtonStyle" TargetType="Button">
<Setter Property="Height" Value="36" />
<Setter Property="Padding" Value="18,0" />
<Setter Property="Foreground" Value="{StaticResource TextNormalBrush}" />
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="{StaticResource InputBorderBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="FontSize" Value="13" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
x:Name="border"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="#F5F7FA" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Opacity" Value="0.8" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 文字链接按钮 -->
<Style x:Key="LinkButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Transparent" />
@@ -196,7 +129,7 @@
<Border Padding="10,10,10,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="30" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
@@ -205,10 +138,9 @@
<Border Grid.Row="0">
<wpf:SpacingStackPanel Background="{StaticResource CardBgBrush}" HorizontalSpacing="10">
<Grid Width="300">
<Grid Width="200">
<TextBox
x:Name="txtSearch"
Height="30"
Padding="5,0,0,0"
KeyDown="txtSearch_KeyDown"
Style="{StaticResource SearchTextBoxStyle}"
@@ -222,17 +154,56 @@
Text="请输入订单号 / 商品名称"
Visibility="{Binding Text, ElementName=txtSearch, Converter={StaticResource NotHasTextVisibility}}" />
</Grid>
<wpf:TitleContent
Title="发票状态"
Placement="Left"
TitleVerticalAlignment="Center">
<ComboBox
Width="100"
Height="30"
d:SelectedIndex="0"
SelectedIndex="{Binding InvoiceStatus}"
Style="{StaticResource RoundedComboBox}">
<ComboBoxItem Content="全部" />
<ComboBoxItem Content="待开票" />
<ComboBoxItem Content="已申请" />
</ComboBox>
</wpf:TitleContent>
<wpf:TitleContent
Title="时间范围:"
HorizontalContentAlignment="Center"
Placement="Left"
TitleVerticalAlignment="Center">
<WrapPanel>
<DatePicker
Height="30"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
d:SelectedDate="2026/01/01"
SelectedDate="{Binding StartTime}" />
<Border
Width="5"
Height="1"
BorderBrush="LightGray"
BorderThickness="1" />
<DatePicker
Height="30"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
d:SelectedDate="2026/01/01"
SelectedDate="{Binding EndTime}" />
</WrapPanel>
</wpf:TitleContent>
<Button
Width="50"
Height="30"
Command="{Binding SearchCommand}"
Content="搜索"
Style="{StaticResource BasePageButtonStyle}" />
Content="搜索" />
<Button
Height="30"
Command="{Binding ResetCommand}"
Content="重置"
Style="{StaticResource DefaultButtonStyle}" />
Style="{StaticResource LinkButtonStyle}" />
<wpf:TitleContent
Title="买手号:"
@@ -247,11 +218,9 @@
Style="{StaticResource RoundedComboBox}" />
</wpf:TitleContent>
<Button
Height="30"
Padding="5,0"
Command="{Binding ReadOrderCommand}"
Content="读取订单"
Style="{StaticResource BasePageButtonStyle}"
Visibility="{Binding IsReadOrder, Converter={StaticResource Boolean2VisibilityReConverter}}" />
<Button
Height="30"
@@ -261,13 +230,22 @@
Style="{StaticResource BasePageButtonStyle}"
Visibility="{Binding IsReadOrder, Converter={StaticResource Boolean2VisibilityConverter}}" />
<Button
Height="30"
Padding="10,0"
Command="{Binding BatchInvoiceCommand}"
Content="批量开票"
Style="{StaticResource BasePageButtonStyle}" />
Visibility="{Binding IsBatchInvoicing, Converter={StaticResource Boolean2VisibilityReConverter}}" />
<Button
Padding="10,0"
Command="{Binding StopBatchInvoiceCommand}"
Content="停止开票"
Visibility="{Binding IsBatchInvoicing, Converter={StaticResource Boolean2VisibilityConverter}}" />
<Button
Padding="10,0"
Command="{Binding ShowSettingDialogCommand}"
Content="设置"
Style="{StaticResource BasePageButtonLightStyle}" />
<wpf:TitleContent
<!--<wpf:TitleContent
Title="公司:"
Placement="Left"
TitleVerticalAlignment="Center">
@@ -299,11 +277,12 @@
Maximum="999999"
Minimum="0"
Value="{Binding MaxAmount}" />
</wpf:TitleContent>
</wpf:TitleContent>-->
<CheckBox
VerticalContentAlignment="Center"
Content="显示订单窗口"
IsChecked="{Binding IsOrderListDialogOpen}" />
</wpf:SpacingStackPanel>
</Border>
<!-- 订单列表(已移除分页与订单分组) -->
@@ -403,15 +382,18 @@
<Border Background="White">
<!-- 列表(虚拟化滚动加载) -->
<ItemsControl
x:Name="itemsControl"
Margin="0,2,0,-2"
Padding="0"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Orders}">
ItemsSource="{Binding OrdersView}">
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer
x:Name="PART_ScrollViewer"
CanContentScroll="True"
HorizontalScrollBarVisibility="Disabled"
ScrollChanged="ScrollViewer_ScrollChanged"
VerticalScrollBarVisibility="Auto">
<ItemsPresenter />
</ScrollViewer>
@@ -479,8 +461,7 @@
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
IsChecked="{Binding IsSelected}"
IsEnabled="{Binding IsSelected}" />
IsChecked="{Binding IsSelected}" />
<!-- 商品 -->
<Grid Grid.Column="1" VerticalAlignment="Center">
@@ -493,7 +474,27 @@
Height="72"
Background="#EEEEEE"
CornerRadius="5">
<Image Source="{Binding ThumbUrl, Converter={StaticResource ImageUrlToBitmapImage}, IsAsync=True}" Stretch="UniformToFill" />
<Image Stretch="UniformToFill">
<converters:AsyncImageLoader.Request>
<MultiBinding Converter="{StaticResource ImageLoadRequestConverter}">
<Binding Path="ThumbUrl" />
<Binding Path="DataContext.IsLoadImage" RelativeSource="{RelativeSource AncestorType=UserControl}" />
</MultiBinding>
</converters:AsyncImageLoader.Request>
</Image>
<!--<Image
converters:AsyncImageLoader.IsLoadImage="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext.IsLoadImage}"
converters:AsyncImageLoader.SourceUrl="{Binding ThumbUrl}"
Stretch="UniformToFill">
-->
<!--<Image.Source>
<MultiBinding Converter="{StaticResource ImageUrlToBitmapImageConverter}" Mode="OneWay">
<Binding IsAsync="True" Path="ThumbUrl" />
<Binding Path="DataContext.IsLoadImage" RelativeSource="{RelativeSource AncestorType=UserControl}" />
</MultiBinding>
</Image.Source>-->
<!--
</Image>-->
</Border>
<StackPanel
Grid.Column="1"
@@ -653,13 +654,12 @@
Value="{Binding ProgressValue}" />
<Grid Margin="10,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="100*" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox
Grid.Row="2"
Grid.Column="1"
Grid.Column="0"
Margin="4,0,0,0"
VerticalAlignment="Center"
d:Text="共计:{}"
@@ -668,6 +668,17 @@
Foreground="White"
IsReadOnly="True"
Text="{Binding BottomMsg}" />
<TextBox
Grid.Column="1"
Margin="4,0,0,0"
VerticalAlignment="Center"
HorizontalContentAlignment="Right"
d:Text="共计:{}"
Background="Transparent"
BorderThickness="0"
Foreground="White"
IsReadOnly="True"
Text="{Binding BottomRMsg}" />
</Grid>
</Grid>
@@ -1,4 +1,5 @@
using _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels;
using CefSharp.DevTools.Overlay;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -13,6 +14,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace _29WxOrderWpf.Ctrls.PDDInvoice;
@@ -21,10 +23,17 @@ namespace _29WxOrderWpf.Ctrls.PDDInvoice;
/// </summary>
public partial class PDDInvoiceView : UserControl
{
private PDDInvoiceViewModel vm = new PDDInvoiceViewModel();
public PDDInvoiceView()
{
InitializeComponent();
DataContext = new PDDInvoiceViewModel();
DataContext = vm;
vm.BatchInvoiceChanged += Vm_BatchInvoiceChanged;
}
private void Vm_BatchInvoiceChanged(object sender, int e)
{
ScrollToCurrent(e);
}
private void txtSearch_KeyDown(object sender, KeyEventArgs e)
@@ -34,4 +43,60 @@ public partial class PDDInvoiceView : UserControl
viewModel.SearchCommand.Execute(null);
}
}
private DispatcherTimer _scrollStopTimer;
private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
// 每次滚动都重置计时器
if (_scrollStopTimer == null)
{
_scrollStopTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(100) // 200ms 内无滚动视为停止
};
_scrollStopTimer.Tick += ScrollStopTimer_Tick;
}
_scrollStopTimer.Stop();
_scrollStopTimer.Start();
(DataContext as PDDInvoiceViewModel).IsLoadImage = false;
}
private void ScrollStopTimer_Tick(object sender, EventArgs e)
{
_scrollStopTimer.Stop();
// 用 Background 优先级设置,避免和当前这一帧的滚动惯性/渲染争抢,
// 让 UI 线程先把滚动动画收尾,再去处理这一波图片加载触发
Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
vm.IsLoadImage = true;
}));
}
private void ScrollToCurrent(int index)
{
if (itemsControl == null) return;
// 方案A:逻辑滚动(你的 CanContentScroll=True,推荐)
var sv = itemsControl.Template.FindName("PART_ScrollViewer", itemsControl) as ScrollViewer;
if (sv != null)
{
if (index >= 0)
{
sv.ScrollToVerticalOffset(index - 1);
return;
}
}
// 方案B:兜底,用容器 BringIntoView
itemsControl.UpdateLayout();
var container = itemsControl.ItemContainerGenerator
.ContainerFromItem(vm.SelectedOrder) as FrameworkElement;
container?.BringIntoView();
}
}
+279 -111
View File
@@ -1,134 +1,302 @@
// 填写信息
function changeReactInputValue(inputDom, newText) {
let lastValue = inputDom.value;
inputDom.value = newText;
let event = new Event('input', { bubbles: true });
event.simulated = true;
let tracker = inputDom._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
inputDom.dispatchEvent(event);
}
/*!
* invoice_hook.js · v1.0.0
* 发票申请 Hook
* - 使用 window.InvoiceApply 统一暴露接口
* - 支持重复注入,不重复自动执行
* - CEF 可通过 window.InvoiceApply.__installed 判断脚本是否已注入
* - 执行结果保存在 window.__invoiceApplyResult
*/
; (function (global) {
'use strict';
// 异步 sleep
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// 查找元素(支持选择器或XPath)
function findElement(selector, isXPath = true) {
if (isXPath) {
return document.evaluate(
selector,
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
} else {
return document.querySelector(selector);
}
}
// 完整流程
async function fillInvoiceAndApply(data = {}) {
const {
title = '某某科技有限公司',
taxNumber = '91110000123456789X'
} = data;
console.log('📝 开始填充发票信息...');
// 1. 点击"企业"按钮
const invoiceType = findElement('//*[contains(text(), "企业")]');
if (!invoiceType) {
console.warn('⚠️ 找不到"企业"按钮');
return false;
// 已注入时不重复创建对象或重复自动执行
if (global.InvoiceApply && global.InvoiceApply.__installed) {
return;
}
invoiceType.click();
console.log('✅ 已点击"企业"按钮');
await sleep(500);
var VERSION = '1.0.0';
var state = {
installed: false,
running: false,
result: null,
error: null,
lastRunAt: null
};
// 2. 查找并填充发票抬头
const invoiceTitle = findElement('//label[contains(text(), "发票抬头")]/following-sibling::textarea[1]') ||
findElement('//*[contains(text(), "发票抬头")]/following-sibling::textarea[1]');
if (invoiceTitle) {
changeReactInputValue(invoiceTitle, title);
console.log('✅ 发票抬头已填充');
} else {
console.warn('⚠️ 未找到发票抬头控件');
function sleep(ms) {
return new Promise(function (resolve) {
global.setTimeout(resolve, ms);
});
}
// 3. 查找并填充税号
const taxNumberInput = findElement('//label[contains(text(), "税号")]/following-sibling::input[1]') ||
findElement('//*[contains(text(), "税号")]/following-sibling::input[1]');
if (taxNumberInput) {
changeReactInputValue(taxNumberInput, taxNumber);
console.log('✅ 税号已填充');
} else {
console.warn('⚠️ 未找到税号控件');
// 支持 XPath 或 CSS 选择器
function findElement(selector, isXPath) {
if (isXPath === undefined) isXPath = true;
try {
if (isXPath) {
return global.document.evaluate(
selector,
global.document,
null,
global.XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
}
return global.document.querySelector(selector);
} catch (e) {
return null;
}
}
await sleep(300);
function changeReactInputValue(inputDom, newText) {
if (!inputDom) return false;
// 4. 查找并点击"申请发票"按钮
const applyBtn = findElement('//*[contains(text(), "申请发票")]');
if (!applyBtn) {
console.error('❌ 未找到"申请发票"按钮');
return false;
}
var lastValue = inputDom.value;
var valueSetter = null;
applyBtn.scrollIntoView({ behavior: 'smooth', block: 'center' });
await sleep(300);
applyBtn.click();
console.log('✅ 已点击"申请发票"按钮');
// 优先使用原生 input/textarea value setter,便于 React 感知值变化
try {
var proto = inputDom.tagName === 'TEXTAREA'
? global.HTMLTextAreaElement.prototype
: global.HTMLInputElement.prototype;
// 5. 等待弹窗/状态出现
await sleep(300);
valueSetter = Object.getOwnPropertyDescriptor(proto, 'value');
} catch (e) {
// ignore
}
// 6. 判断状态
// 检查是否有"已经申请过"的提示
const alreadyApplied = findElement('//*[contains(text(), "您已经提交过发票申请了")]')
try {
if (valueSetter && valueSetter.set) {
valueSetter.set.call(inputDom, newText);
} else {
inputDom.value = newText;
}
} catch (e) {
inputDom.value = newText;
}
try {
var tracker = inputDom._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
} catch (e) {
// ignore
}
if (alreadyApplied) {
console.log('✅ 已经申请过,无需重复操作');
return true;
}
const successElement = findElement('//*[text()="确认您的发票信息无误后再提交"]');
if (successElement == null) {
return false;
}
// 检查是否有"确认开具"按钮或提示
const confirmBtn = findElement('//*[text()= "确认"]');
var event;
try {
event = new global.Event('input', { bubbles: true });
} catch (e) {
event = global.document.createEvent('Event');
event.initEvent('input', true, false);
}
event.simulated = true;
inputDom.dispatchEvent(event);
if (confirmBtn) {
console.log('✅ 找到"确认"按钮,准备点击...');
await sleep(200);
confirmBtn.click();
console.log('✅ 已点击"确认"按钮');
return true;
}
// 如果都没有找到
console.warn('⚠️ 未找到"已经申请过"或"确认"按钮,请手动检查');
return false;
}
async function fillInvoiceAndApply(data) {
data = data || {};
// ========== 调用 ==========
(async function () {
try {
const result = await fillInvoiceAndApply({
var title = data.title === undefined
? '某某科技有限公司'
: data.title;
var taxNumber = data.taxNumber === undefined
? '91110000123456789X'
: data.taxNumber;
console.log('[InvoiceApply] 开始填充发票信息...');
// 1. 点击“企业”按钮
var invoiceType = findElement('//*[contains(text(), "企业")]');
if (!invoiceType) {
console.warn('[InvoiceApply] 找不到“企业”按钮');
return false;
}
invoiceType.click();
console.log('[InvoiceApply] 已点击“企业”按钮');
await sleep(500);
// 2. 填充发票抬头
var invoiceTitle =
findElement('//label[contains(text(), "发票抬头")]/following-sibling::textarea[1]') ||
findElement('//*[contains(text(), "发票抬头")]/following-sibling::textarea[1]');
if (invoiceTitle) {
changeReactInputValue(invoiceTitle, title);
console.log('[InvoiceApply] 发票抬头已填充');
} else {
console.warn('[InvoiceApply] 未找到发票抬头控件');
}
// 3. 填充税号
var taxNumberInput =
findElement('//label[contains(text(), "税号")]/following-sibling::input[1]') ||
findElement('//*[contains(text(), "税号")]/following-sibling::input[1]');
if (taxNumberInput) {
changeReactInputValue(taxNumberInput, taxNumber);
console.log('[InvoiceApply] 税号已填充');
} else {
console.warn('[InvoiceApply] 未找到税号控件');
}
await sleep(300);
// 4. 点击“申请发票”
var applyBtn = findElement('//*[contains(text(), "申请发票")]');
if (!applyBtn) {
console.error('[InvoiceApply] 未找到“申请发票”按钮');
return false;
}
if (applyBtn.scrollIntoView) {
applyBtn.scrollIntoView({
behavior: 'smooth',
block: 'center'
});
}
await sleep(300);
applyBtn.click();
console.log('[InvoiceApply] 已点击“申请发票”按钮');
// 5. 等待弹窗或状态出现
await sleep(300);
// 6. 判断申请状态
var alreadyApplied = findElement(
'//*[contains(text(), "您已经提交过发票申请了")]'
);
if (alreadyApplied) {
console.log('[InvoiceApply] 已经申请过,无需重复操作');
return true;
}
var successElement = findElement(
'//*[text()="确认发票信息无误后再提交"]'
);
if (!successElement) {
console.warn('[InvoiceApply] 未检测到确认发票信息的提示');
return false;
}
var confirmBtn = findElement('//*[text()="确认"]');
if (confirmBtn) {
console.log('[InvoiceApply] 找到“确认”按钮');
await sleep(200);
confirmBtn.click();
console.log(
'[InvoiceApply] 已识别确认步骤,未自动提交最终确认'
);
return true;
}
console.warn(
'[InvoiceApply] 未找到“已经申请过”提示或“确认”按钮'
);
return false;
}
function run(data) {
if (state.running) {
return Promise.reject(
new Error('发票申请脚本正在执行,请勿重复调用')
);
}
state.running = true;
state.result = null;
state.error = null;
state.lastRunAt = Date.now();
global.__invoiceApplyResult = null;
return fillInvoiceAndApply(data)
.then(function (result) {
state.result = !!result;
global.__invoiceApplyResult = state.result;
return state.result;
})
.catch(function (ex) {
state.error = String((ex && ex.message) || ex);
state.result = false;
global.__invoiceApplyResult = false;
console.error('[InvoiceApply] 执行异常:', ex);
return false;
})
.then(
function (result) {
state.running = false;
return result;
},
function (ex) {
state.running = false;
throw ex;
}
);
}
var api = {
version: VERSION,
run: run,
findElement: findElement,
changeReactInputValue: changeReactInputValue,
get state() {
return state;
},
get __installed() {
return state.installed;
}
};
function install() {
if (state.installed) {
return api;
}
state.installed = true;
console.log('[InvoiceApply] v' + VERSION + ' 已注入');
// 保留原 invoice.js 的行为:脚本注入后自动执行一次
run({
title: '{公司}',
taxNumber: '{税号}'
});
console.log('执行结果:', result);
// 批量开票时,C# 端轮询该变量获取执行结果
window.__invoiceApplyResult = result;
} catch (ex) {
console.error('执行异常:', ex);
window.__invoiceApplyResult = false;
return api;
}
})();
api.install = install;
global.InvoiceApply = api;
install();
})(typeof window !== 'undefined' ? window : this);
@@ -0,0 +1 @@
var _0xodc = 'jsjiami.com.v7'; var _0x20193a = _0x210f; function _0x1a46() { var _0x56c665 = (function () { return [_0xodc, 'PqljsTeUjiCarWmi.UwcyfobCmr.yuvW7tCtuXBl==', 'WRBdTGpdT0u', 'WO0CW47dHa', 'W43cUXVdLSon', 'W4BcS03cQ8ks', 'ygFdL8kNdCojrq', 'zSkCD8kItW', 'WPjwW6pcNqJcQa', 'zoINMUwmGU++Gq', 'W69xWPxcMJ0', 'qhFdQ0T1', 'WR/cKLPWWQC', 'WOJcOmo4W4zBxa', 'fCkxzSkWsa', 'WRaMW6xdUJ4', 'i8klgWhdQq', 'tCkAcwZcLa', 'BSk/WPKUFSooWORcU8kw', 'W7pcSmkQFKi', '5QMh5OMR5RMw5yUA5Roa5P2V6kwl5y2P5lMB5l2w6k2O5RoF77Yi6AcC6zYG5y6y6ioh5BEy57Ut5Rov5P6/5PU+5Asm77Yp5OUB5yQd6kgy5lUa5zY75RMi5yQL5AY75zUc5yAd7765', 'WPtcR8oKW5a', 'W64hW5xdSCot', 'qSkfWPS8C8oLWOdcL8krW5ufyG', 'eSoDW6exdHpdMq', 'W58MWQCya1y', 'CSk7C8kDxa', 'AZvVWQu', 'mrfYtf8', 'fmo8W7O0cq', 'hCkyWQ3dQCo9', 'W7FcIXFdKmoF', 'W6XTrmkHgcFcVWyZW53cLSoGWR4eW6y2kSkLgr5pyqhcV0m2WPtdS8kNkr8LW4edwmkWrL/dR3X3W5ZdINnzybPwbmoueW', 'vt5rWRye', 'f8kBcaddUG', 'k8kEWPJdU8o4WQrToSow', 'WQFcIfhdUCk1', 'WQFcGhrd', 'WRldJSonp8k+', 'tgZcO8oIW59G', 'W44CpCoDq8obvG', 'W5ZcMmkVAgG', 'W6ZcTCocWP0pW5u/W7qx', 'W43cKbaj', 'W4T6WPNcGYu', 'vCoPjCoFW7JcK1lMIP3PLje', 'vmoroSouW6y', 'W4tcI0BcPSkjW78', 'W5TqWP/cHG', 'W5xcMSovWRO0', 'WRJcM3XcWPK', 'W5z5WPdcGqe', 'nSk7DmkFDW', 'W5ZcIsJdVmoC', 'W6H+WRBcJHu', 'W7upW5VdVSoD', 'fCoeW6aBaGm', 'WPtdVSoiiCkbW4rk', 'cSkTgWZdPmk3WQ4YWP8', 'W5hcVmoAWOi1', 'h8knxCkhBq', 'hmogmCoHWOpcNSkT5OI+6zEO', 'WQJcOeJdTCkk', 'WPKPAb0k', 'W47cGbCZzu5eWQPXeCoQWOVdQSo7nCkL', 'amole8oVWOJcL8ofW4dcMctcL8om', 'W5mSpCoSzq', 'WQ5sa8k8W6m', 'FCoqn8oY', 'W5TEfNBdKq', 'cdLgvNa', 'kYGxoCkf', 'eSonW7Wx', 'WO3cGCoAW7bB', 'WRajW4FdMIu', 'nhqnW4BdHW', 'pw/dJ8kBW5/cQG', 'WQjtbmkcxmoiW6tdRSo9', 'BSkdC0/cHa5c', 'vSoOmmoVW4K', 'nmkChWhdN8kBWRm1WOZdQCkLWOC', 'WPT+W7ZcTby', 'gxGwW6FdHG', 'W7ddVt/cUfRdK3S5W6q', 'W4ZcGdxdUCoa', 'FhFdHmkwpG', 'W6VcTCobWPKHW5SVW6G', 'W6GAWQ4Tjq', 'WRGLCCkl', 'ww/dQK5dW7FcGmoChColyq', 'W4C5W4NdOmosqWrRWRq', 'rgtdQmkWjq', 'W7GbuSkSsSoM', 'w8kwWQ8suW', 'l8ktWPddOmoD', 'CSkKwfJcPa', 'f0RcPCo7lG', 'WRX8W4xcKtO', 'W7C7WO/dM8oU', 'W4ipWOxdQ8oh', 'W6JcMYFdLSoS', 'nSkgtCktFW', 'W4FcHcddVSonW7mR', 'WPZdUSkMA8kMW6GHWOBcOW', 'W59uWOFcQZJdOSofWRldGHaqutOMlUwNJoI2Na', 'W6CRWQGqpG', 'pJDXC0rXW4RdLmoti3q', 'W5tcGmovWQWu', 'C8ksoLxcUa', 'W5/cGflcPG', 'rCkRsCkIz8oR', 'pfmMW6ldHWa', 'FCkeumkPzG', 'kmk0WRFdHmoH', 'WQ18W4RcSGO', 'W6SsW5BdTa', 'WQmMW7ddPHS', 'WPTvW6VcNX/cTmkdW6FcVCkIWOP0umkzW50', 'W5VcJfhcQW', 'thJcOCo0W4HN', 'gCoBdSoU', 'WR95r8keWRhcMCk6W41+W5SDAay', 'WR0buI8O', 'nLNcOSo8lLRdHH3dQa', 'f8kCWP3dN8od', 'WQtcIxvdWPNdSG', 'idnZCNnNW4/dRSoengvQW6O', 'W7mmWOZdU8og', 'W4ZcM8ohWR8V', 'DSkAgKZcUcuDWQi', 'BSoJn8oBW6G', 'smklWQmmDW', 'W5dcIGeiBfOFWRzJc8ofWOxdRSo7jCk4WQePDMu', 'W7lcH8oeWQmx', 'qxJdV1Tf', 'WPpdVaBdMLK', 'imomeSoMWP0', 'WQdcGCouW41Z', 'WOxcIg/dJmk1', 'cCoAW6aDaai', 'WRZdJSkHsSk4', 'WR85E8kxoq', 'b0xdSCkVW4q', 'WRONvcik', 'WQpcJMb/WOVdQctcHSoWpCoCW5uhhW', 'WRldUCkUB8kB', 'WRyKuSkpoq', 'W4qGEmketmoQW4/dSSoc', 'W4FdTSo7W5tdQa', 'W6pdGSobxWhdTSoP', 'WRfYv8kUWRVcSSk5', 'WQBdTcJdMMe', 'C8kvduG', 'W5FcUSkQW4Knvmk3W6/dJW', 'WR3dHrxdKfC', 'rNlcSCoJW5TDWPRdKJi', 'W4JcKuVcR8kF', 'A8kdyeRcGb5DmmkFW5C+emki', 'DCkFi1JcMG', 'BmowkCoU', 'vWvKbSo1WO01WORdMwarwmkSWPNdLL/cICoEja', 'W77dQdNcR1JdJNO4', 'WOGpxGGOW5FdQq', 'smoIbmolW7RcHqzjESkVWOTqW7m', 'sCoKb8orW7pcMJPJyCkSWOzw', 'xSo+sCkaWPpcI2RcNSogct5LDCkIfG', 'WRuBESkjeG', 'WPRdHd7dP3O', 'DMZdKmk8aCoyqCokW55T', 'F0pdN3ns', 'W5ZcHdpdRmobW6i9', 'v8oqdCokW4K', 'WQ3cIMDtWPq', 'WR3cRwbaWR3cGCkU', 'W5VcQYeyBW', 'W5efDmk4Dq', 'W6xdU8ohW7VdK8kJW5lcTCk8vw8KmMC', 'WPqfrSkWjq', 'bSktWQldUmoF', 'W6eMv8kXCW', 'vmkqA3VcJa', 'me7cUSoUleZdGbhdVSk6W6JcQa', 'W41Ti0BdJa', 'ESoqimoYWObGWQu', 'wCkMv8kIASoJ', 'vKNcRmo9W7i', 'WOnYnCkPW5PG', 'nmoDcCkyW4hcVZBcJCkCegG', 'p8oUbCoSWRW', 'W60oW7xdLSos', 'W4PPWP/cHG4', 'W5uoWOhdJmoS', 'y0ZdVLja', 'BmkAoKZcTIq', 'aqKxemkr', 'WOaqxJ8o', 'WP7cSxbYWRi', 'WQP1W57cSX4', 'WOTJiCkeW6C', 'W6tdNSodta', 'e8krqCkhC8kmEG', 'WPz+rSk+WRC', 'fuRcNCoyjG', 'FCoCi8oJWQ16WRxdIa', 'WQOszY4K', 'W57dNs/cUM8', 'tgZdIK5dW5/cH8oZcmorvSkUcey6', 'WOBdTCoopSk3W4raB8oWpSkvW7u', 'WOGlvWK', 'aHLZFM8', '77YA77Yo5yo55Q6Z576F6AoF', 'oCkiDeFcKva', 'W7BdJSo/tai', 'WQVdGCkpuCkGW7u1WRhcTCoFWPGMWQH8W4FLTi7LIQJMJzq', 'WOPPW5FcQt4', 'W4DqihBdPqq', 'B8oxoCo+WRb2WR7dN8kDvmoKWOK', 'WQNcLmoBW7nC', 'gCoNcSkjW4NcGWRcLSkyb2K', 'mL3cV8o8lG', 'W78AWOVdKmoSW58', 'W6KYa8oLW7m', 'W7CqW5ZdTSoeyG9HWQW', 'W5RcUCohWRGu', 'WQxcJN5v', 'W67dGrhcH3O', 'W7mqWOtdHSoNW58NW4mwpstdGW', 'W47cHCkrWO7cMq', 'vCogaCo8W5e', 'W4rAo2ddRW/cGq', 'BCkreLNcNICTW6pcR0a', 'gSkwhIldPq', 'BmkUwKxcTW', 'W6hdPCoWBsK', 'W4VdT8o3BsddUSoJyCoXW7i', 'W5/cRG42BW', 'W6JcNaOksG', 'W7CrtSk5w8oGW57dLmoinSkO', 'W5byWOdcNJNdPmov', 'lN/cISohdW', 'lmkxWPZdQmoX', 'rCkNtSk/AmoI', 'WRRcM2n1WQ0', 'WPxdMYZdTMq', 'W6hdSCogW5tdIq', 'yhBdHmkLeCoz', 'z3VdLCk0', 'psrMyMrN', 'WRlcM0tdSW', 'DdTVWQmK', 'gmkXxSk+rq', 'WQTOxmk5WQy', 'mMVcOCodlq', 'W4NcQCoGWRuU', 'WQydW6ZdNW0', 'xSoAoSofWP0', 'W4OZWO8toq', 'CCkjyKVcIWXegG', 'peCKW7tdKaCeAK/cVcO', 'W6Wpgmooua', 'xSksWO0VAmo1', 'z3ddJmk2a8opuG', 'EsXLWQWy', 'imoOi8kPW60', 'tmkLine truncated
@@ -1,4 +1,5 @@
using AllBase.Model.Result;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -22,7 +23,6 @@ public class PddBrowserOrderInvoiceViewModel : BindableBaseEx
get => _isSelected;
set => SetProperty(ref _isSelected, value, nameof(IsSelected));
}
public string buyerId { get; set; } // 买手Id
public string buyerName { get; set; } // 买手名称
/// <summary>
@@ -41,7 +41,6 @@ public class PddBrowserOrderInvoiceViewModel : BindableBaseEx
/// 订单号
/// </summary>
public string order_sn { get; set; }
public int status { get; set; }
public int pay_status { get; set; }
public string order_status_prompt { get; set; }
@@ -51,11 +50,10 @@ public class PddBrowserOrderInvoiceViewModel : BindableBaseEx
public string order_link_url { get; set; }
public List<order_good> order_Goods { get; set; }
public List<OrderButtonItem> order_buttons { get; set; }
public string GoodsName { get => order_Goods?.FirstOrDefault()?.goods_name ?? ""; }
private string _goodsName;
public string GoodsName { get => _goodsName ?? order_Goods?.FirstOrDefault()?.goods_name ?? ""; set => _goodsName = value; }
/// <summary>
/// 是否已开票
/// </summary>
@@ -65,21 +63,45 @@ public class PddBrowserOrderInvoiceViewModel : BindableBaseEx
set
{
SetValue(value);
base.RaisePropertyChanged(nameof(InvoiceStatusText));
InvoiceStatusText = value ? "已提交申请" : "待开票";
}
}
public int Quantity => order_Goods?.Sum(a => a.goods_number.Value) ?? 0;
private string _invoiceStatusText = "待开票";
/// <summary> 发票状态文案:已开票 / 待开票 </summary>
public string InvoiceStatusText => IsInvoiced ? "已提交申请" : "待开票";
public string InvoiceStatusText
{
get => _invoiceStatusText;
set => SetValue(ref _invoiceStatusText, value);
}
public DateTime OrderTime
{
get => DateTimeHelper.ConvertFromUnixTimestampInSeconds(order_time);
}
public string ThumbUrl => order_Goods?.FirstOrDefault()?.thumb_url ?? "";
private string _thumburl;
public string ThumbUrl
{
get { return _thumburl ?? order_Goods?.FirstOrDefault()?.thumb_url ?? ""; }
set { _thumburl = value; }
}
public string DisplayAmount => (order_amount / 100.0).ToString("F2");
public PddBrowserOrderInvoiceViewModel()
{
}
public PddBrowserOrderInvoiceViewModel(OrderInvoiceInfo info)
{
_goodsName = info.GoodsName;
order_amount = info.order_amount;
order_time = info.order_time;
order_sn = info.order_sn;
order_link_url = info.order_link_url;
IsInvoiced = info.IsInvoiced;
_thumburl = info.ThumbUrl;
}
}
public class OrderButtonItem
@@ -91,4 +113,31 @@ public class OrderButtonItem
public class ButtonTypeValue
{
public string Url { get; set; }
}
public class OrderInvoiceInfo
{
/// <summary>
/// 订单价
/// </summary>
public int order_amount { get; set; }
/// <summary>
/// 下单时间
/// </summary>
public long order_time { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string order_sn { get; set; }
/// <summary>
/// 订单详情
/// </summary>
public string order_link_url { get; set; }
/// <summary>
/// 是否已开票
/// </summary>
public bool IsInvoiced { get; set; }
public string ThumbUrl { get; set; }
public string GoodsName { get; set; }
}
@@ -1,5 +1,5 @@
using _29WxOrderWpf.CefHelper;
using _29WxOrderWpf.Commands;
using WxOrder.Framework.Commons;
using AllBase;
using CefSharp;
using CefSharp.Handler;
@@ -16,6 +16,7 @@ using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using Work._29Tools.CefTools;
using Work.BaseForms;
using WxOrder.Framework.Helpers;
namespace _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels;
@@ -23,22 +24,14 @@ namespace _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels;
public partial class PDDInvoiceViewModel
{
/// <summary>
/// 订单列表浏览器
/// 订单列表浏览器
/// </summary>
public ChromiumWebBrowser Browser { get; private set; }
/// <summary>
/// 内容浏览器
/// 订单详情
/// 发票详情
/// 申请发票
/// </summary>
public ChromiumWebBrowser BrowserDetail { get; private set; }
private IFrame frame;
partial void InitBrowser()
{
BrowserZIndex = -1;
BrowserDetailZIndex = -1;
Browser = WPFCEFBrowser.CreateChromiumWebBrowser("about:blank", false);
LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler();
@@ -49,13 +42,7 @@ public partial class PDDInvoiceViewModel
Browser.KeyboardHandler = new KeyboardHandler();
Browser.LoadingStateChanged += Browser_LoadingStateChanged;
BrowserDetail = WPFCEFBrowser.CreateChromiumWebBrowser("about:blank", false);
LocalResourceRequestHandler detailResourceRequestHandler = new LocalResourceRequestHandler();
detailResourceRequestHandler.ResourceLoadCompleteEvent += DetailRequestHandler_ResourceLoadComplete;
BrowserDetail.RequestHandler = new LocalRequestHandler(resourceRequestHandler);
BrowserDetail.LifeSpanHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
BrowserDetail.KeyboardHandler = new KeyboardHandler();
BrowserDetail.LoadingStateChanged += BrowserDetail_LoadingStateChanged;
}
private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
@@ -65,75 +52,31 @@ public partial class PDDInvoiceViewModel
var b = (ChromiumWebBrowser)sender;
b.Dispatcher.InvokeAsync(async () =>
{
if (b.Address != null && b.Address.StartsWith("https://mobile.yangkeduo.com/orders.html"))
{
StartAutoScroll();
}
});
}
}
private void BrowserDetail_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
if (e.IsLoading == false)
{
var b = (ChromiumWebBrowser)sender;
b.Dispatcher.InvokeAsync(async () =>
{
if (b.Address != null && b.Address.StartsWith("https://mobile.yangkeduo.com/transac_return_compensation.html"))
if (b.Address != null && b.Address.StartsWith("https://mobile.yangkeduo.com/orders.html"))//加载完成 加载 js
{
string html = await b.GetBrowser().GetSourceAsync();
if (html.Contains("window.rawData"))
frame = b.GetMainFrame();
string content = ResourceHelper.GetResourceText("/Ctrls/PDDInvoice/Resources/order.js", "29WxFindOrder");
if (string.IsNullOrEmpty(content)) return;
Install(frame, content);
if (await IsInstalledAsync(frame))
{
await ExecuteInvoiceApplyScriptAsync(b);
StartAutoScroll();
//await b.EvaluateScriptAsync(frame, content);
}
else
{
// 页面异常(未渲染出发票表单)时直接判定失败,避免批量开票长时间等待
_currentInvoiceTcs?.TrySetResult(false);
BaseMsgForm.ShowError("订单读取失败");
}
}
});
}
}
/// <summary>
/// 注入发票填写脚本并执行。
/// 单张申请模式保持原有行为;批量开票模式下轮询脚本写入的
/// <c>window.__invoiceApplyResult</c>,完成后通过 <see cref="_currentInvoiceTcs"/> 回传结果。
/// </summary>
private async Task ExecuteInvoiceApplyScriptAsync(ChromiumWebBrowser b)
{
string content = ResourceHelper.GetResourceText("/Ctrls/PDDInvoice/Resources/invoice.js", "29WxFindOrder");
content = content.Replace("{公司}", InvoiceTitle);
content = content.Replace("{税号}", TaxNo);
if (string.IsNullOrEmpty(content)) return;
await b.EvaluateScriptAsync(content);
if (_currentInvoiceTcs == null) return; // 单张申请模式:保持原有行为
// 批量模式:等待异步脚本执行完成
// 捕获当前 TCS,避免批量循环超时进入下一个订单后,迟到的轮询误触发新订单的结果
var tcs = _currentInvoiceTcs;
for (int i = 0; i < 120; i++)
{
await Task.Delay(500);
try
{
var res = await b.EvaluateScriptAsync("window.__invoiceApplyResult");
if (res.Success && res.Result != null)
{
tcs.TrySetResult(Convert.ToBoolean(res.Result));
return;
}
}
catch
{
}
}
tcs.TrySetResult(false);
}
public ICommand CloseInvoiceDetailCommand => new DelegateCommand(HidenOrderBrowserDetail);
@@ -142,35 +85,20 @@ public partial class PDDInvoiceViewModel
get => GetValue<int>();
set => SetValue(value);
}
public int BrowserDetailZIndex
{
get => GetValue<int>();
set => SetValue(value);
}
/// <summary>
/// 显示主浏览器
/// 显示主浏览器
/// </summary>
public void ShowOrderBrowser()
{
BrowserZIndex = 10;
BrowserDetailZIndex = -1;
}
/// <summary>
/// 显示子浏览器
/// </summary>
public void ShowOrderBrowserDetail()
{
BrowserZIndex = -1;
BrowserDetailZIndex = 10;
}
public void HidenOrderBrowser()
{
BrowserZIndex = -1;
}
public void HidenOrderBrowserDetail()
{
BrowserDetailZIndex = -1;
}
public bool IsReadOrder
{
get => GetValue<bool>();
@@ -178,73 +106,111 @@ public partial class PDDInvoiceViewModel
}
private int top = 0;
private DateTime lastGetOrderDataTime = DateTime.Now;
private string lastOrderSN = "0";
private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
{
if (url.StartsWith("https://mobile.yangkeduo.com/orders.html"))
{
//if (isAutoScroll == false)
//{
// StartAutoScroll();
//}
StartAutoScroll();
}
if (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/aristotle/order_list_v"))
{
lastGetOrderDataTime = DateTime.Now;
parserData(responseData);
parserData(responseData, out lastOrderSN);
Debug.WriteLine($"LastOrder:{lastOrderSN}");
//File.WriteAllText(@$"E:\{Guid.NewGuid().ToString()}.txt", responseData);
}
}
public void StartAutoScroll()
{
if (frame == null)
{
StopAutoScroll(); return;
}
if (IsReadOrder) return;
IsReadOrder = true;
_ = autoScroll(_cancellationTokenSource.Token);
//_ = autoScroll(_cancellationTokenSource.Token);
_ = autoLoadOrderData(_cancellationTokenSource.Token);
}
// 停止滚动
// 停止滚动
public void StopAutoScroll()
{
IsReadOrder = false;
_cancellationTokenSource?.Cancel();
_cancellationTokenSource?.Dispose();
_cancellationTokenSource = null;
}
private async Task autoScroll(CancellationToken token)
Application.Current?.Dispatcher.BeginInvoke(new Action(() =>
{
BottomMsg = $"订单读取结束";
}));
CompleteProgress();
}
private async Task autoLoadOrderData(CancellationToken token)
{
string templastOrderSN = "";
while (IsReadOrder && !token.IsCancellationRequested)
{
if ((DateTime.Now - lastGetOrderDataTime).Seconds > 30) StopAutoScroll();
top += Randomx.GetId(450, 600);
var jsStr = @"window.scroll({
top: " + top + @",
left: 0,
behavior: 'smooth' // 可选,使滚动平滑
});";
var client = Browser.GetDevToolsClient();
if (client != null)
if (lastOrderSN == templastOrderSN)
{
var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
result.Wait(5000);
await Task.Delay(500);
continue;
}
await Task.Delay(Randomx.GetId(100, 300));
string jsStr = $"PDDOrders.trigger({{offset:'MO-01-{lastOrderSN}',type:0,size:10,mode:'store'}})";
templastOrderSN = lastOrderSN;
await frame.EvaluateScriptAsync(jsStr);
await Task.Delay(Randomx.GetId(1000, 3000));
//Thread.Sleep();
}
}
private void DetailRequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
/// <summary>文档创建时注入(每个 document 注入一次即可,脚本本身幂等)</summary>
public void Install(IFrame frame, string hookJs)
{
if (url.StartsWith("https://mobile.yangkeduo.com/transac_return_compensation.html"))
{
}
if (frame == null || string.IsNullOrEmpty(hookJs)) return;
frame.ExecuteJavaScriptAsync(hookJs);
}
/// <summary>脚本是否已就绪(注入后自检用;异步,不会卡 UI 线程)</summary>
public async Task<bool> IsInstalledAsync(IFrame frame, int timeoutMs = 3000)
{
var deadline = DateTime.Now.AddMilliseconds(timeoutMs);
while (DateTime.Now < deadline)
{
var r = await frame.EvaluateScriptAsync("!!(window.PDDOrders && window.PDDOrders.__installed)")
.ConfigureAwait(false);
if (r != null && r.Success && r.Result is bool && (bool)r.Result) return true;
await Task.Delay(100).ConfigureAwait(false);
}
return false;
}
//private async Task autoScroll(CancellationToken token)
//{
// while (IsReadOrder && !token.IsCancellationRequested)
// {
// if ((DateTime.Now - lastGetOrderDataTime).Seconds > 30) StopAutoScroll();
// top += Randomx.GetId(450, 600);
// var jsStr = @"window.scroll({
// top: " + top + @",
// left: 0,
// behavior: 'smooth' // 可选,使滚动平滑
// });";
// var client = Browser.GetDevToolsClient();
// if (client != null)
// {
// var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
// result.Wait(5000);
// }
// await Task.Delay(Randomx.GetId(100, 300));
// //Thread.Sleep();
// }
//}
}
@@ -0,0 +1,181 @@
using _29WxOrderWpf.CefHelper;
using CefSharp;
using CefSharp.Handler;
using CefSharp.Wpf;
using Newtonsoft.Json.Linq;
using NPOI.XWPF.UserModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Controls;
using Work._29Tools.CefTools;
using Work.BaseForms;
using WxOrder.Framework.Commons;
using WxOrder.Framework.Helpers;
namespace _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels;
public partial class PDDInvoiceViewModel
{
/// <summary>
/// 内容浏览器
/// 订单详情
/// 发票详情
/// 申请发票
/// </summary>
public ChromiumWebBrowser BrowserDetail { get; private set; }
partial void InitBrowserDetail()
{
BrowserDetailZIndex = -1;
BrowserDetail = WPFCEFBrowser.CreateChromiumWebBrowser("about:blank", false);
LocalResourceRequestHandler detailResourceRequestHandler = new LocalResourceRequestHandler();
detailResourceRequestHandler.ResourceLoadCompleteEvent += DetailRequestHandler_ResourceLoadComplete;
BrowserDetail.RequestHandler = new LocalRequestHandler(detailResourceRequestHandler);
BrowserDetail.LifeSpanHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
BrowserDetail.KeyboardHandler = new KeyboardHandler();
BrowserDetail.LoadingStateChanged += BrowserDetail_LoadingStateChanged;
}
public int BrowserDetailZIndex
{
get => GetValue<int>();
set => SetValue(value);
}
/// <summary>
/// 显示子浏览器
/// </summary>
public void ShowOrderBrowserDetail()
{
BrowserZIndex = -1;
BrowserDetailZIndex = 10;
}
public void HidenOrderBrowserDetail()
{
BrowserDetailZIndex = -1;
}
private void BrowserDetail_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
if (e.IsLoading == false)
{
var b = (ChromiumWebBrowser)sender;
b.Dispatcher.InvokeAsync(async () =>
{
if (b.Address != null && b.Address.StartsWith("https://mobile.yangkeduo.com/transac_return_compensation.html"))
{
string orderSN = Regex.Match(b.Address, "order_sn=(?<sn>\\d+-\\d+)").Groups["sn"].Value;
string html = await b.GetBrowser().GetSourceAsync();
if (html.Contains("window.rawData"))
{
if (html.Contains("\"hasApplied\":true,"))
{
_currentInvoiceTcs?.TrySetResult(new Result<bool> { Data = true });
return;
}
await ExecuteInvoiceApplyScriptAsync(b);
}
else
{
// 页面异常(未渲染出发票表单)时直接判定失败,避免批量开票长时间等待
_currentInvoiceTcs?.TrySetResult(new Result<bool> { Data = false });
}
}
});
}
}
/// <summary>
/// 注入发票填写脚本并执行。
/// 单张申请模式保持原有行为;批量开票模式下轮询脚本写入的
/// <c>window.__invoiceApplyResult</c>,完成后通过 <see cref="_currentInvoiceTcs"/> 回传结果。
/// </summary>
private async Task ExecuteInvoiceApplyScriptAsync(ChromiumWebBrowser b)
{
string content = ResourceHelper.GetResourceText("/Ctrls/PDDInvoice/Resources/invoice.js", "29WxFindOrder");
content = content.Replace("{公司}", Config.Title);
content = content.Replace("{税号}", Config.TaxNo);
if (string.IsNullOrEmpty(content)) return;
await b.EvaluateScriptAsync(content);//执行js
// 检查是否注入成功
if (await IsInstalledDetailAsync(b) == false)
{
IsBatchInvoicing = false;
BaseMsgForm.ShowError("JS错误,开票失败");
_currentInvoiceTcs.TrySetResult(new Result<bool> { Data = false });
return;
}
//for (int i = 0; i < 120; i++)//循环获取结果
//{
// await Task.Delay(500);
// try
// {
// var res = await b.EvaluateScriptAsync("window.__invoiceApplyResult");
// if (res.Success && res.Result != null)
// {
// _currentInvoiceTcs.TrySetResult(Convert.ToBoolean(res.Result));
// return;
// }
// }
// catch
// {
// }
//}
//_currentInvoiceTcs.TrySetResult(false);
}
public async Task<bool> IsInstalledDetailAsync(ChromiumWebBrowser frame, int timeoutMs = 3000)
{
var deadline = DateTime.Now.AddMilliseconds(timeoutMs);
while (DateTime.Now < deadline)
{
var r = await frame.EvaluateScriptAsync("!!(window.InvoiceApply && window.InvoiceApply.__installed)")
.ConfigureAwait(false);
if (r != null && r.Success && r.Result is bool && (bool)r.Result) return true;
await Task.Delay(100).ConfigureAwait(false);
}
return false;
}
private void DetailRequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
{
if (url.StartsWith("https://mobile.yangkeduo.com/proxy/api/api/order/invoice/apply"))
{
var obj = JObject.Parse(responseData);
bool isSuccess = obj.Value<bool?>("result") == true;
if (isSuccess)
{
_currentInvoiceTcs.TrySetResult(new Result<bool> { Data = true });
}
else
{
string errMsg = obj.Value<string>("error_msg");
_currentInvoiceTcs.TrySetResult(new Result<bool> { Data = false, Msg = errMsg });
}
return;
//{"order_sn":"260921-458426969742556","mall_id":697300659,"trigger_status":1,"business_type":1,"payer_name":"合肥弘贸电子商务有限公司","invoice_kind":0,"invoice_type":0,"letter_head_id":"690562059266556","letterhead_snapshot_id":"SI298036413700604","paper_certificate_url":"","entrust_certify_url":"","source":1,"anti_content":"0asAfoyqYiPs6gd2J0WQ9QOUtOrZ44_LwPI3lrN83FY_wympvl577D6QppXrSLrHJn8eNWv8uXBTdg6_iPUC1aDYt-JuCI1dMpKg2wsf65KUBPzEhRU8pGAbTnWhcJ29ooVcncR90coLgWQiLJ0Xjo0Y4aHEJnnk2lr2PRkY2Kj9ibYc9QW-i2Mr23mjyQMQIahwAhEX-xjSVJEd35qSDQo9VrbY0Fb4kiiL0tHoKEQqmgMcn1BIH9LQB30NJ9s857b25NDDXQyuIT9hR2fCiRoY-96khLJ8QI6wqNL8Q406RBojM6oYsKqEGEFNn7Qyr4N3q-FELBTkkmyToyzs4cM1iUKl3Zaqe0MtFefxmZcLUj3FFxQ6GdAAfKO2WlAkwx7QuMppG7UtkEpRuNjrkojzegy1jaIBWzPrzevvx3egES52PIHEFZASpZ2gNPXaDGSbVGu8shqGDmXuu94aWgXxEE3CzPfVcUZooGs40ThX0ouQF7IFTKM6-NSsk8ZrVjEHdWO1-EE_SCngMCC1vFeAr1g5NvaUCC_87CibfVcWPe5lhgRaq6dKfSAYDoT_bA0nPm6wSDZSxAQbSk-1JZC-O6OpFqXcrkKVUZk0atnozQtKlf1cxcyCl_EkEMnpwZll4g3jEKUxLK_XCIUz0TjDUbF1dpZOsWd39crq7VktSKKZ32b_e0sk6ZkvAf5F7GKwfvfy6RX5YbcrCcpfsjJqaXNGy2G2Y_Oj0iPcpgaXv0zmJjkB217RMtwxBybZnjdOMIlGJWUFls4unwncEvdy4Udgi7EdgB_MXwgn2zGa1_wHKltF7n37wKjKBKlysnfv8mFfqzH3Jv7L4jj9cCQ7P5Fb3E8KQ9J","payer_register_no":"91340103MAKBDKB764","payer_phone":"","payer_account":"","payer_address":"","payer_bank":""}
//{"server_time":1792493897,"result":true}
/*
{
"server_time": 1792493128,
"error_code": 17003,
"error_msg": "商家已与您协商开票,如有需要,请联系商家"
}*/
}
}
}
@@ -1,7 +1,6 @@
using _29WxOrderWpf.BaseWindows;
using _29WxOrderWpf.CefHelper;
using _29WxOrderWpf.Commands;
using _29WxOrderWpf.Common;
using _29WxOrderWpf.Ctrls.Statistics;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
@@ -10,9 +9,10 @@ using AllBase.Util;
using CefSharp;
using CefSharp.Handler;
using CefSharp.Wpf;
using MAX.Core.Helpers;
using NaiBa.Util.Extension;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Asn1.X509;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@@ -27,11 +27,18 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
using Work._29Tools.CefTools;
using Work.BaseForms;
using WPFCommon.Converters;
using WPFCommon.Helpers;
using WPFCommon.Models;
using WxOrder.Framework.Commons;
using WxOrder.Framework.Commons;
using WxOrder.Framework.Commons;
using WxOrder.Framework.Commons.Dialogs;
using WxOrder.Framework.Helpers;
namespace _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels;
@@ -39,9 +46,10 @@ namespace _29WxOrderWpf.Ctrls.PDDInvoice.ViewModels;
/// <summary>
/// 拼多多发票助手 视图模型
/// </summary>
public partial class PDDInvoiceViewModel : BindableBaseEx
public partial class PDDInvoiceViewModel : BindableBaseEx, IDialogAware, IDisposable
{
private readonly ObservableCollection<PddBrowserOrderInvoiceViewModel> _allOrders = new();
private const string ConfigPath = "./invoice.config";
private List<OrderInvoiceInfo> OrderInvoiceInfoList = new();
private readonly HashSet<string> _orderSns = new();
private string _searchText = "";
private PddBrowserOrderInvoiceViewModel _selectedOrder;
@@ -49,28 +57,67 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
private bool _isInvoiceDetailOpen;
private string _invoiceTitle = "";
private string _taxNo = "";
private CancellationTokenSource _cancellationTokenSource; public PDDInvoiceViewModel()
private CancellationTokenSource _cancellationTokenSource;
private InvoiceConfig Config { get; set; }
/// <summary> 订单列表 </summary>
public ObservableCollection<PddBrowserOrderInvoiceViewModel> Orders { get; }
public ICollectionView OrdersView { get; }
public PDDInvoiceViewModel()
{
_cancellationTokenSource = new CancellationTokenSource();
Config = NaiBa.Util.Helper.ConfigHelper.LoadConfig<InvoiceConfig>(ConfigPath);
Orders = new ObservableCollection<PddBrowserOrderInvoiceViewModel>();
Orders.CollectionChanged += Orders_CollectionChanged;
OrdersView = CollectionViewSource.GetDefaultView(Orders);
OrdersView.Filter = FilterPredicate;
OrdersView.SortDescriptions.Add(
new SortDescription(nameof(PddBrowserOrderInvoiceViewModel.order_time), ListSortDirection.Ascending));
BuyerLoginList = GlobalConfig.PDDBuyerLoginList;
//Orders = new ObservableCollection<PDDInvoiceOrderModel>(_allOrders);
InitBrowser();
InitBrowser(); InitBrowserDetail();
if (Config == null) Config = new InvoiceConfig();
EndTime = DateTime.Now;
StartTime = EndTime.AddMonths(-1);
if (EnvironmentHelper.IsTest)
{
InvoiceTitle = "嵩县雷神商贸有限责任公司";
TaxNo = "91410325MADQERT68E";
MaxAmount = 99;
Config.Title = "嵩县雷神商贸有限责任公司";
Config.TaxNo = "91410325MADQERT68E";
Config.MaxAmount = 99;
_ = InitSampleData();
}
}
partial void InitBrowser();
private bool FilterPredicate(object obj)
{
if (obj is not PddBrowserOrderInvoiceViewModel order) return false;
// 发票状态过滤
bool? temp = InvoiceStatus == 0 ? null : InvoiceStatus == 2;
if (temp.HasValue && order.IsInvoiced != temp.Value)
return false;
// 关键字过滤
var keyword = SearchText?.Trim();
if (!IsKeywordMatch(order, keyword))
return false;
if (order.OrderTime < StartTime || EndTime < order.OrderTime) return false;
return true;
}
/// <summary>
/// 获取筛选后的数据
/// </summary>
/// <returns></returns>
private IEnumerable<PddBrowserOrderInvoiceViewModel> GetFilterOrders()
{
return OrdersView.Cast<PddBrowserOrderInvoiceViewModel>();
}
partial void InitBrowser();
partial void InitBrowserDetail();
/// <summary> 列表增删时订阅/退订订单勾选状态,用于刷新表头全选状态 </summary>
private void Orders_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
@@ -105,6 +152,13 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
public ObservableCollectionThreadSafe<BuyerLoginInfo> BuyerLoginList { get; set; } = new ObservableCollectionThreadSafe<BuyerLoginInfo>();
private void InvoiceStatusChanged()
{
}
public BuyerLoginInfo SelectedBuyer
{
get => GetProperty(() => SelectedBuyer);
@@ -115,11 +169,8 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
{
WPFCEFBrowser.SetCookieAsync(SelectedBuyer.cookie, Browser.GetCookieManager()).GetAwaiter();
WPFCEFBrowser.SetCookieAsync(SelectedBuyer.cookie, BrowserDetail.GetCookieManager()).GetAwaiter();
}
/// <summary> 订单列表 </summary>
public ObservableCollection<PddBrowserOrderInvoiceViewModel> Orders { get; }
/// <summary> 搜索关键字:订单号 / 商品名称 / 买家 </summary>
public string SearchText
@@ -127,6 +178,21 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
get => _searchText;
set => SetProperty(ref _searchText, value, nameof(SearchText));
}
public int InvoiceStatus
{
get => GetValue<int>();
set => SetValue(value, InvoiceStatusChanged);
}
public DateTime StartTime
{
get => GetValue<DateTime>();
set => SetValue(value);
}
public DateTime EndTime
{
get => GetValue<DateTime>();
set => SetValue(value);
}
/// <summary> 开票弹窗是否打开 </summary>
public bool IsOrderListDialogOpen
@@ -160,19 +226,19 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
set => SetProperty(ref _selectedOrder, value, nameof(SelectedOrder));
}
/// <summary> 发票抬头 </summary>
public string InvoiceTitle
{
get => _invoiceTitle;
set => SetProperty(ref _invoiceTitle, value, nameof(InvoiceTitle));
}
///// <summary> 发票抬头 </summary>
//public string InvoiceTitle
//{
// get => _invoiceTitle;
// set => SetProperty(ref _invoiceTitle, value, nameof(InvoiceTitle));
//}
/// <summary> 税号 </summary>
public string TaxNo
{
get => _taxNo;
set => SetProperty(ref _taxNo, value, nameof(TaxNo));
}
///// <summary> 税号 </summary>
//public string TaxNo
//{
// get => _taxNo;
// set => SetProperty(ref _taxNo, value, nameof(TaxNo));
//}
/// <summary>
/// 开始开票总金额
/// </summary>
@@ -181,14 +247,14 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
get => GetValue<decimal>();
set => SetValue(value);
}
/// <summary>
/// 最大开票金额
/// </summary>
public decimal MaxAmount
{
get => GetValue<decimal>();
set => SetValue(value);
}
///// <summary>
///// 最大开票金额
///// </summary>
//public decimal MaxAmount
//{
// get => GetValue<decimal>();
// set => SetValue(value);
//}
/// <summary>
/// 已开票金额
/// </summary>
@@ -205,11 +271,21 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
get => GetValue<decimal>();
set => SetValue(value);
}
public bool IsLoadImage
{
get => GetValue<bool>();
set => SetValue(value);
}
public ICommand SearchCommand => new DelegateCommand(Search);
public ICommand ResetCommand => new DelegateCommand(ResetSearch);
public ICommand OpenInvoiceCommand => new DelegateCommand<PddBrowserOrderInvoiceViewModel>(OpenInvoice);
public ICommand OpenInvoiceCommand => new AsyncDelegateCommand<PddBrowserOrderInvoiceViewModel>(OpenInvoice);
public ICommand ShowInvoiceCommand => new DelegateCommand<PddBrowserOrderInvoiceViewModel>(ShowInvoice);
@@ -226,7 +302,6 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
BaseMsgWindow.ShowError("未填选择买手号");
return;
}
_cancellationTokenSource = new CancellationTokenSource();
Debug.WriteLine("开始读单");
BottomMsg = $"开始读取订单";
StartProgress();
@@ -235,12 +310,34 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
if (!IsReadOrder)
{
_orderSns.Clear();
_allOrders.Clear();
Orders.Clear();
OrderInvoiceInfoList.Clear();
string path = string.Format(inviceDataPath, SelectedBuyer.buyer_id);
if (File.Exists(NaiBa.Util.Helper.ConfigHelper.GetConfigUserPath(path)))
{
var ret = BaseMsgWindow.ShowConfirm("检测到已有历史数据是否加载?").DialogResult;
if (ret == true)
{
var data = NaiBa.Util.Helper.ConfigHelper.LoadConfig<List<OrderInvoiceInfo>>(path);
AddOrders(data.Select(a => new PddBrowserOrderInvoiceViewModel(a)));
BottomMsg = $"已加载历史数据";
return;
}
else if (ret == null)
{
return;
}
}
Browser.Load("https://mobile.yangkeduo.com/orders.html");
await Task.Delay(Timeout.Infinite, _cancellationTokenSource.Token);
}
await Task.Delay(Timeout.Infinite, _cancellationTokenSource.Token);
}
catch (TaskCanceledException)
@@ -279,7 +376,7 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
if (_isUpdatingSelectAll) return;
if (value == true)
{
foreach (var order in Orders)
foreach (var order in GetFilterOrders())
{
if (order.IsInvoiced == false)
{
@@ -338,7 +435,7 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
}
/// <summary> 当前正在批量处理的订单,页面脚本执行完成后通过它回传结果 </summary>
private TaskCompletionSource<bool> _currentInvoiceTcs;
private TaskCompletionSource<Result<bool>> _currentInvoiceTcs;
public ICommand BatchInvoiceCommand => new AsyncDelegateCommand(BatchInvoice);
@@ -349,31 +446,74 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
{
if (IsBatchInvoicing) return;
if (string.IsNullOrEmpty(InvoiceTitle) || string.IsNullOrEmpty(TaxNo))
if (string.IsNullOrEmpty(Config.Title) || string.IsNullOrEmpty(Config.TaxNo))
{
BaseMsgWindow.ShowError("未填写公司或税号");
return;
}
var targets = Orders.Where(o => o.IsSelected && !o.IsInvoiced).ToList();
var targets = GetFilterOrders().Where(o => o.IsSelected && !o.IsInvoiced).ToList();
if (targets.Count == 0)
{
BaseMsgWindow.ShowError("请先勾选需要开票的订单");
return;
}
if (MaxAmount <= 0)
if (Config.MaxAmount <= 0)
{
BaseMsgWindow.ShowError("请填写开票总金额");
return;
}
var confirm = BaseMsgWindow.ShowConfirm(
$"已勾选 {targets.Count} 个待开票订单,确定开始批量开票吗?\n请确认发票抬头与税号无误。\n开票总金额:{MaxAmount}",
$"已勾选 {targets.Count} 个待开票订单,确定开始批量开票吗?\n请确认发票抬头与税号无误。\n开票总金额:{Config.MaxAmount}",
"批量开票");
if (confirm.DialogResult != true) return;
await BatchInvoiceAsync(targets);
//Config.Title = InvoiceTitle;
//Config.TaxNo = TaxNo;
//Config.MaxAmount = MaxAmount;
//NaiBa.Util.Helper.ConfigHelper.SaveConfig(ConfigPath, Config);
try
{
await BatchInvoiceAsync(targets);
}
catch (Exception ex)
{
BaseMsgWindow.ShowError("批量开票异常:" + ex.Message);
}
finally
{
BaseMsgWindow.ShowInfo(BottomMsg);
}
}
public ICommand StopBatchInvoiceCommand => new AsyncDelegateCommand(StopBatchInvoice);
private async Task StopBatchInvoice()
{
IsBatchInvoicing = false;
}
public ICommand ShowSettingDialogCommand => new DelegateCommand(ShowSettingDialog);
private void ShowSettingDialog()
{
var view = new PDDInvoiceDialog(Config);
DialogService.ShowDialog(view, null, result =>
{
if (result.Result == ButtonResult.OK)
{
Config.Assign(view.Config);
NaiBa.Util.Helper.ConfigHelper.SaveConfig(ConfigPath, Config);
}
});
}
public event EventHandler<int> BatchInvoiceChanged;
public event Action<IDialogResult> RequestClose;
/// <summary>
/// 后台批量开票:逐单加载开票页并自动填写提交,底部进度条实时更新,成功后更新列表状态
/// </summary>
@@ -390,13 +530,21 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
for (int i = 0; i < targets.Count; i++)
{
if (AmountTotal >= MaxAmount)
if (IsBatchInvoicing == false)
{
BottomMsg = "已取消批量开票";
return;
}
if (AmountTotal >= Config.MaxAmount)
{
return;
}
var order = targets[i];
BottomMsg = $"正在批量开票:{i}/{targets.Count},当前订单:{order.order_sn}";
ProgressValue = i;
SelectedOrder = order;
BatchInvoiceChanged?.Invoke(this, GetFilterOrders().ToList().IndexOf(order));
bool ok = false;
if (EnvironmentHelper.IsTest)
{
@@ -405,12 +553,12 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
}
else
{
_currentInvoiceTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
_currentInvoiceTcs = new TaskCompletionSource<Result<bool>>(TaskCreationOptions.RunContinuationsAsynchronously);
BrowserDetail.Load($"https://mobile.yangkeduo.com/transac_return_compensation.html?_t_timestamp=transac_modify_invoice&order_sn={order.order_sn}");
// 等待页面脚本执行完成(最长 60 秒)
var done = await Task.WhenAny(_currentInvoiceTcs.Task, Task.Delay(TimeSpan.FromSeconds(60)));
ok = done == _currentInvoiceTcs.Task && _currentInvoiceTcs.Task.Result;
Task done = await Task.WhenAny(_currentInvoiceTcs.Task, Task.Delay(TimeSpan.FromSeconds(10)));
ok = done == _currentInvoiceTcs.Task && _currentInvoiceTcs.Task.Result.Data;
}
if (ok)
{
@@ -418,30 +566,44 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
order.IsSelected = false;
success++;
AmountTotal += order.order_amount / 100m;
if (Config.IsSaveData)
{
var temp = OrderInvoiceInfoList?.FirstOrDefault(a => a.order_sn == order.order_sn);
if (temp != null) temp.IsInvoiced = true;
}
}
else
{
if (_currentInvoiceTcs.Task.IsCompleted)
{
order.InvoiceStatusText = _currentInvoiceTcs.Task.Result.Msg;
}
fail++;
}
ProgressValue = success + fail;
BottomMsg = $"正在批量开票:{i}/{targets.Count},当前订单:{order.order_sn}。总金额:{AmountTotal.ToString("N2")}";
BottomRMsg = $"批量开票状态:成功 {success} 个,失败 {fail} 个。总金额:{AmountTotal.ToString("N2")}";
StatisticsInvoiceAmount();
await Task.Delay(1000);
await Task.Delay(200);
if (Config.IsSaveData)
{
SaveOrderInvoiceInfo();
}
}
}
catch (Exception ex)
{
fail = targets.Count - success;
BaseMsgWindow.ShowError("批量开票异常:" + ex.Message);
throw ex;
}
finally
{
_currentInvoiceTcs = null;
ProgressMaximum = targets.Count;
ProgressValue = targets.Count;
BottomMsg = $"批量开票完成:成功 {success} 个,失败 {fail} 个。总金额:{AmountTotal.ToString("N2")}";
IsBatchInvoicing = false;
BaseMsgWindow.ShowInfo(BottomMsg);
}
}
/// <summary>
@@ -449,8 +611,8 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
/// </summary>
private void StatisticsInvoiceAmount()
{
InvoicedAmountTotal = Orders.Where(a => a.IsInvoiced).Sum(a => a.order_amount) / 100m;
UninvoicedAmountTotal = Orders.Where(a => a.IsInvoiced == false).Sum(a => a.order_amount) / 100m;
InvoicedAmountTotal = GetFilterOrders().Where(a => a.IsInvoiced).Sum(a => a.order_amount) / 100m;
UninvoicedAmountTotal = GetFilterOrders().Where(a => a.IsInvoiced == false).Sum(a => a.order_amount) / 100m;
}
#endregion
@@ -458,12 +620,22 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
/// <summary> 按 订单号 / 商品名称 过滤订单 </summary>
private void Search()
{
var keyword = SearchText?.Trim();
Orders.Clear();
foreach (var order in _allOrders.Where(o => IsKeywordMatch(o, keyword)))
{
Orders.Add(order);
}
OrdersView.Refresh();
StatisticsInvoiceAmount();
//var keyword = SearchText?.Trim();
//bool? _tempIsInvoiced = InvoiceStatus == 0 ? null : InvoiceStatus == 2;
//foreach (var order in Orders)
//{
// if (_tempIsInvoiced.HasValue)
// {
// if (order.IsInvoiced != _tempIsInvoiced.Value) continue;
// }
// if (!IsKeywordMatch(order, keyword))
// {
// continue;
// }
// Orders.Add(order);
//}
}
private static bool IsKeywordMatch(PddBrowserOrderInvoiceViewModel order, string keyword)
@@ -476,22 +648,36 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
private void ResetSearch()
{
SearchText = "";
InvoiceStatus = 0;
EndTime = DateTime.Now;
StartTime = EndTime.AddMonths(-1);
Search();
}
/// <summary>
/// 申请开票
/// </summary>
/// <param name="order"></param>
private void OpenInvoice(PddBrowserOrderInvoiceViewModel order)
private async Task OpenInvoice(PddBrowserOrderInvoiceViewModel order)
{
SelectedOrder = order;
if (string.IsNullOrEmpty(InvoiceTitle) || string.IsNullOrEmpty(TaxNo))
if (string.IsNullOrEmpty(Config.Title) || string.IsNullOrEmpty(Config.TaxNo))
{
BaseMsgWindow.ShowError("未填写公司或税号");
return;
}
BrowserDetail.Load($"https://mobile.yangkeduo.com/transac_return_compensation.html?_t_timestamp=transac_modify_invoice&order_sn={order.order_sn}");
ShowOrderBrowserDetail();
//BrowserDetail.Load($"https://mobile.yangkeduo.com/transac_return_compensation.html?_t_timestamp=transac_modify_invoice&order_sn={order.order_sn}");
try
{
await BatchInvoiceAsync(new List<PddBrowserOrderInvoiceViewModel>
{
order
});
}
catch (Exception ex)
{
BaseMsgWindow.ShowError("开票异常:" + ex.Message);
}
}
private void ShowInvoice(PddBrowserOrderInvoiceViewModel order)
@@ -520,36 +706,36 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
#region 数据解析
private void parserData(string data)
{
parserData(data, out string _);
}
private void parserData(string data, out string lastOrderSN)
{
lastOrderSN = "0";
List<PddBrowserOrderInvoiceViewModel> list = JsonHelper.DeserializeJsonToList<PddBrowserOrderInvoiceViewModel>(JsonHelper.JObjectParse(data)["orders"].ParseToString());
if (list.Count == 0)
{
StopAutoScroll();
return;
}
lastOrderSN = list.Last().order_sn;
var currentLastItem = list.Last();
var matched = list.Where(item => item.status == 4 && item.pay_status == 2).ToList();
if (matched.Count == 0)
{
return;
}
// CEF 回调运行在后台线程,ObservableCollection 的更新需要切回 UI 线程
var dispatcher = Application.Current?.Dispatcher;
if (dispatcher == null || dispatcher.CheckAccess())
Application.Current?.Dispatcher.BeginInvoke(new Action(() =>
{
AddOrders(matched);
}
else
{
dispatcher.BeginInvoke(new Action(() =>
if (matched.Count > 0)
{
AddOrders(matched);
BottomMsg = $"正在读取订单,读取日期{matched.Last().OrderTime.ToString("yyyy-MM-dd")}";
}));
}
}
BottomMsg = $"正在读取订单,读取日期{currentLastItem.OrderTime.ToString("yyyy-MM-dd")}";
}));
}
@@ -563,15 +749,31 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
{
continue;
}
_allOrders.Add(item);
if (IsKeywordMatch(item, keyword))
if (item.IsInvoiced == false)
{
item.IsInvoiced = item.order_buttons?.Any(a => a.brief_prompt == "发票详情") ?? false;
Orders.Add(item);
}
Orders.Add(item);
if (Config.IsSaveData)
{
OrderInvoiceInfoList.Add(new OrderInvoiceInfo
{
GoodsName = item.GoodsName,
order_amount = item.order_amount,
order_time = item.order_time,
order_sn = item.order_sn,
order_link_url = item.order_link_url,
IsInvoiced = item.IsInvoiced,
ThumbUrl = item.ThumbUrl
});
}
}
StatisticsInvoiceAmount();
if (Config.IsSaveData)
{
SaveOrderInvoiceInfo();
}
}
#endregion
@@ -608,10 +810,33 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
}
}
Orders.FirstOrDefault().IsInvoiced = true;
return Task.CompletedTask;
}
private const string inviceDataPath = "inviceData_{0}";
/// <summary>
/// 保存数据
/// </summary>
private void SaveOrderInvoiceInfo()
{
if (SelectedBuyer == null) return;
string path = string.Format(inviceDataPath, SelectedBuyer.buyer_id);
NaiBa.Util.Helper.ConfigHelper.SaveConfig<List<OrderInvoiceInfo>>(path, OrderInvoiceInfoList);
}
private void GetOrderInvoiceInfo()
{
if (SelectedBuyer == null) return;
string path = string.Format(inviceDataPath, SelectedBuyer.buyer_id);
if (File.Exists(NaiBa.Util.Helper.ConfigHelper.GetConfigUserPath(path)))
{
if (BaseMsgWindow.ShowConfirm("检测到已有旧数据是否加载?").DialogResult == true)
{
var data = NaiBa.Util.Helper.ConfigHelper.LoadConfig<List<OrderInvoiceInfo>>(path);
AddOrders(data.Select(a => new PddBrowserOrderInvoiceViewModel(a)));
}
}
}
@@ -624,6 +849,13 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
set => SetValue(ref _bottomMsg, value);
}
private string _bottomRMsg = "";
public string BottomRMsg
{
get => _bottomRMsg;
set => SetValue(ref _bottomRMsg, value);
}
private double _progressValue;
public double ProgressValue
{
@@ -637,6 +869,9 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
get => _progressMaximum;
set => SetValue(ref _progressMaximum, value);
}
public string Title => "发票助手";
public void SetProgress(int value, int maxValue)
{
StopUnknownTotalProgressTimer();
@@ -710,7 +945,44 @@ public partial class PDDInvoiceViewModel : BindableBaseEx
}
_unknownTotalProgressTimer = null;
}
public void Dispose()
{
StopAutoScroll();
Browser.Dispose();
BrowserDetail.Dispose();
}
public void OnDialogOpened(IDialogParameters parameters)
{
}
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
Dispose();
}
#endregion
#endregion
}
public class InvoiceConfig
{
public string Title { get; set; }
public string TaxNo { get; set; }
public decimal MaxAmount { get; set; }
public bool IsSaveData { get; set; } = true;
public void Assign(InvoiceConfig config)
{
Title = config.Title;
TaxNo = config.TaxNo;
MaxAmount = config.MaxAmount;
IsSaveData = config.IsSaveData;
}
}
@@ -0,0 +1,297 @@
<Window
x:Class="_29WxOrderWpf.Ctrls.Settings.SettingsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.Settings"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:_29WxOrderWpf.ViewModels"
xmlns:wpf="WPFCommon"
Title="设置"
Width="800"
Height="450"
d:DataContext="{d:DesignInstance Type=vm:SettingViewModel}"
ResizeMode="NoResize"
ShowInTaskbar="False"
WindowStartupLocation="CenterScreen"
WindowState="Normal"
mc:Ignorable="d">
<Border BorderBrush="#e8eaed" BorderThickness="1">
<TabControl
ItemContainerStyle="{StaticResource SideTabItem}"
Style="{StaticResource SideTabControl}"
TabStripPlacement="Left">
<TabItem Header="拍单">
<StackPanel>
<Border Style="{StaticResource SettingRow}">
<Grid Visibility="{Binding ShowEnablePddTransitTraditionalAddress}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Style="{StaticResource SettingTitle}" Text="云仓拍单" />
<TextBlock Style="{StaticResource SettingDesc}" Text="多多云仓拍单随机繁体详细地址" />
</StackPanel>
<CheckBox
Grid.Column="1"
VerticalAlignment="Center"
d:Visibility="Visible"
IsChecked="{Binding SwitchEnablePddTransitTraditionalAddress}"
Style="{StaticResource ToggleSwitch}" />
</Grid>
</Border>
<Border Style="{StaticResource SettingRow}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Style="{StaticResource SettingTitle}" Text="直发拍单" />
<TextBlock Style="{StaticResource SettingDesc}" Text="允许直发拍单" />
</StackPanel>
<CheckBox
Grid.Column="1"
VerticalAlignment="Center"
d:Visibility="Visible"
IsChecked="{Binding SwitchEnableDirectBuy}"
Style="{StaticResource ToggleSwitch}" />
</Grid>
</Border>
</StackPanel>
</TabItem>
<TabItem Header="发货">
<StackPanel>
<Border Style="{StaticResource SettingRow}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Style="{StaticResource SettingTitle}" Text="礼品单发送" />
<TextBlock Style="{StaticResource SettingDesc}" Text="超出6元自动改为礼品二(实物)" />
</StackPanel>
<CheckBox
Grid.Column="1"
VerticalAlignment="Center"
d:Visibility="Visible"
IsChecked="{Binding AutoSwitchGiftType}"
IsEnabled="False"
Opacity="0.5"
Style="{StaticResource ToggleSwitch}"
Visibility="Collapsed" />
</Grid>
</Border>
</StackPanel>
</TabItem>
<!-- ========== 外观 ========== -->
<!--
<TabItem Header="外观" Tag="🎨">
<StackPanel
MaxWidth="720"
Margin="40,32,40,32"
HorizontalAlignment="Left">
<TextBlock Style="{StaticResource PageTitle}" Text="外观" />
<TextBlock Style="{StaticResource PageSubtitle}" Text="自定义界面的主题、颜色和字体。" />
<Border Style="{StaticResource SettingsCard}">
<StackPanel>
<Border Style="{StaticResource SettingRow}">
<StackPanel>
<TextBlock Style="{StaticResource SettingTitle}" Text="主题" />
<TextBlock Style="{StaticResource SettingDesc}" Text="选择浅色、深色或跟随系统" />
<StackPanel Margin="0,12,0,0" Orientation="Horizontal">
<RadioButton
Margin="0,0,20,0"
Content="浅色"
IsChecked="True" />
<RadioButton Margin="0,0,20,0" Content="深色" />
<RadioButton Content="跟随系统" />
</StackPanel>
</StackPanel>
</Border>
<Border BorderThickness="0" Style="{StaticResource SettingRow}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Style="{StaticResource SettingTitle}" Text="强调色" />
<TextBlock Style="{StaticResource SettingDesc}" Text="用于按钮、选中项等强调元素" />
</StackPanel>
<StackPanel
Grid.Column="1"
VerticalAlignment="Center"
Orientation="Horizontal">
<Border
Width="24"
Height="24"
Margin="0,0,8,0"
Background="#0078D4"
CornerRadius="12" />
<Border
Width="24"
Height="24"
Margin="0,0,8,0"
Background="#6E4AFF"
CornerRadius="12" />
<Border
Width="24"
Height="24"
Background="#E73C3C"
CornerRadius="12" />
</StackPanel>
</Grid>
</Border>
</StackPanel>
</Border>
</StackPanel>
</TabItem>
-->
<!-- ========== 账户 ========== -->
<!--
<TabItem Header="账户" Tag="👤">
<StackPanel
MaxWidth="720"
Margin="40,32,40,32"
HorizontalAlignment="Left">
<TextBlock Style="{StaticResource PageTitle}" Text="账户" />
<TextBlock Style="{StaticResource PageSubtitle}" Text="管理你的账号、头像和登录方式。" />
<Border Padding="20" Style="{StaticResource SettingsCard}">
<StackPanel Orientation="Horizontal">
<Border
Width="64"
Height="64"
Background="#0078D4"
CornerRadius="32">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="28"
Foreground="White"
Text="A" />
</Border>
<StackPanel Margin="16,0,0,0" VerticalAlignment="Center">
<TextBlock
FontSize="16"
FontWeight="SemiBold"
Foreground="#1F2329"
Text="Alex" />
<TextBlock
Margin="0,2,0,0"
FontSize="13"
Foreground="#8A9099"
Text="alex@example.com" />
</StackPanel>
<Button
Margin="20,0,0,0"
Padding="16,6"
VerticalAlignment="Center"
Content="编辑资料" />
</StackPanel>
</Border>
</StackPanel>
</TabItem>
-->
<!-- ========== 隐私 ========== -->
<!--
<TabItem Header="隐私" Tag="🔒">
<StackPanel
MaxWidth="720"
Margin="40,32,40,32"
HorizontalAlignment="Left">
<TextBlock Style="{StaticResource PageTitle}" Text="隐私" />
<TextBlock Style="{StaticResource PageSubtitle}" Text="控制应用如何使用你的数据。" />
<Border Style="{StaticResource SettingsCard}">
<StackPanel>
<Border Style="{StaticResource SettingRow}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Style="{StaticResource SettingTitle}" Text="发送匿名使用数据" />
<TextBlock Style="{StaticResource SettingDesc}" Text="帮助改进产品,不含个人身份信息" />
</StackPanel>
<CheckBox
Grid.Column="1"
VerticalAlignment="Center"
IsChecked="True"
Style="{StaticResource ToggleSwitch}" />
</Grid>
</Border>
<Border BorderThickness="0" Style="{StaticResource SettingRow}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Style="{StaticResource SettingTitle}" Text="个性化推荐" />
<TextBlock Style="{StaticResource SettingDesc}" Text="根据使用习惯推荐内容" />
</StackPanel>
<CheckBox
Grid.Column="1"
VerticalAlignment="Center"
Style="{StaticResource ToggleSwitch}" />
</Grid>
</Border>
</StackPanel>
</Border>
</StackPanel>
</TabItem>
-->
<!-- ========== 关于 ========== -->
<!--
<TabItem Header="关于" Tag="{StaticResource txt-table_stack_above}">
<StackPanel
MaxWidth="720"
Margin="40,32,40,32"
HorizontalAlignment="Left">
<TextBlock Style="{StaticResource PageTitle}" Text="关于" />
<TextBlock Style="{StaticResource PageSubtitle}" Text="版本与许可信息。" />
<Border Padding="20" Style="{StaticResource SettingsCard}">
<StackPanel>
<TextBlock
FontSize="18"
FontWeight="SemiBold"
Foreground="#1F2329"
Text="MyApp" />
<TextBlock
Margin="0,4,0,0"
FontSize="13"
Foreground="#8A9099"
Text="版本 1.0.0 (Build 20261005)" />
<TextBlock
Margin="0,16,0,0"
FontSize="12"
Foreground="#8A9099"
Text="© 2026 My Company. All rights reserved." />
<StackPanel Margin="0,16,0,0" Orientation="Horizontal">
<Button
Margin="0,0,8,0"
Padding="16,6"
Content="检查更新" />
<Button Padding="16,6" Content="查看许可" />
</StackPanel>
</StackPanel>
</Border>
</StackPanel>
</TabItem>-->
</TabControl>
</Border>
</Window>
@@ -0,0 +1,65 @@
using _29WxOrderWpf.ViewModels;
using AllBase;
using AllBase.Helper;
using AllBase.Model.Config;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Work.BaseForms;
namespace _29WxOrderWpf.Ctrls.Settings;
/// <summary>
/// SettingsView.xaml 的交互逻辑
/// </summary>
public partial class SettingsView : Window
{
private SettingViewModel vm;
public SettingsView()
{
InitializeComponent();
vm = new SettingViewModel();
this.DataContext = vm;
this.Loaded += SettingsView_Loaded;
this.Closed += SettingsView_Closed;
}
private void SettingsView_Loaded(object sender, RoutedEventArgs e)
{
vm.Assign(BaseClass.Setting);
}
private void SettingsView_Closed(object sender, EventArgs e)
{
try
{
var setting = vm.ToConfig();
BaseClass.Setting = setting;
NaiBa.Util.Helper.ConfigHelper.SaveConfig(SettingViewModel.SettingFileName, JsonConvert.SerializeObject(setting));
foreach (var order in GlobalConfig.lstOrder)
{
foreach (var orderItem in order.orderItems)
{
orderItem.UpdateOrderItemBuyButton();
orderItem.SetAbnormalAndDirectBtnVisibility();
}
}
}
catch (Exception ex)
{
BaseMsgForm.ShowError("配置保存错误");
}
}
}
+350 -321
View File
@@ -1,327 +1,356 @@
<UserControl
x:Class="_29WxOrderWpf.Ctrls.ShopCtrls.ShopListCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.ShopCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="shopListCtrl"
d:DesignHeight="450"
d:DesignWidth="800"
Loaded="shopListCtrl_Loaded"
mc:Ignorable="d">
<Grid Background="{StaticResource ListCtrlBackColorBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="40" />
<RowDefinition Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
x:Class="_29WxOrderWpf.Ctrls.ShopCtrls.ShopListCtrl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.ShopCtrls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="shopListCtrl"
d:DesignHeight="450"
d:DesignWidth="800"
Loaded="shopListCtrl_Loaded"
mc:Ignorable="d">
<Grid Background="{StaticResource ListCtrlBackColorBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="40" />
<RowDefinition Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Grid x:Name="gridSearch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Margin="6,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="店名" />
<Border
Grid.Column="1"
Height="26"
Margin="4"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
CornerRadius="4">
<TextBox
x:Name="txtShopName"
Margin="3,0"
VerticalContentAlignment="Center"
Style="{StaticResource BaseTextBoxStyle}" />
</Border>
<TextBlock
Grid.Column="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="分组" />
<Border
Grid.Column="3"
Height="26"
Margin="4"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
CornerRadius="4">
<ComboBox
x:Name="cmbGroup"
Margin="3,0"
VerticalContentAlignment="Center"
SelectionChanged="cmbGroup_SelectionChanged"
Style="{StaticResource BaseComboBoxStyle}" />
</Border>
<TextBlock
Grid.Column="4"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="备注" />
<Border
Grid.Column="5"
Height="26"
Margin="4"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
CornerRadius="4">
<ComboBox
x:Name="cmbNotes"
Margin="3,0"
VerticalContentAlignment="Center"
SelectionChanged="cmbNotes_SelectionChanged"
Style="{StaticResource BaseComboBoxStyle}" />
</Border>
<Button
x:Name="btnSearch"
Grid.Row="4"
Grid.Column="6"
Height="26"
Click="btnSearch_Click"
Content=" 搜索 "
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnRestore"
Grid.Row="4"
Grid.Column="7"
Height="26"
Margin="4,0,6,0"
Click="btnRestore_Click"
Content=" 还原 "
Style="{StaticResource BasePageButtonLightStyle}" />
</Grid>
<Grid
x:Name="lstTitle"
Grid.Row="1"
Margin="4,0"
Background="{StaticResource ListHeadBackColorBrush}">
<Border BorderBrush="{StaticResource ListHeadBorderColorBrush}" BorderThickness="0,0,1,0">
<DataGrid
x:Name="dgShopHeader"
Grid.ColumnSpan="100"
Margin="0,0,18,0"
AutoGenerateColumns="False"
BorderThickness="0"
CanUserReorderColumns="False"
ColumnDisplayIndexChanged="dgShopHeader_ColumnDisplayIndexChanged"
ColumnHeaderHeight="{Binding ElementName=lstTitle, Path=ActualHeight}"
LayoutUpdated="dgShopHeader_LayoutUpdated">
<DataGrid.Columns>
<DataGridTemplateColumn
x:Name="colSelectAll"
Width="50"
Header="选择"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<Grid Width="14" Height="14">
<!--<CheckBox x:Name="headerCheckBox" BorderThickness="0" IsChecked="{Binding DataContext.AreAllSelected, RelativeSource={RelativeSource AncestorType=DataGrid}, UpdateSourceTrigger=PropertyChanged}" Checked="HeaderCheckBox_Checked" Unchecked="HeaderCheckBox_Unchecked"/>-->
<CheckBox
x:Name="chkSelectAll"
BorderThickness="0"
Checked="ChkSelectAll_Checked"
IsChecked="False"
IsThreeState="True"
Loaded="ChkSelectAll_Loaded"
Unchecked="ChkSelectAll_Unchecked" />
<Border
Width="14"
Height="14"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
IsHitTestVisible="False" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!--<CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center"/>-->
<CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn
Width="100*"
Header="AppId"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="100*"
Header="店铺名称"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="100*"
Header="分组"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="82*"
Header=" 备注"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
</DataGrid.Columns>
</DataGrid>
</Border>
</Grid>
<!--<ListBox Grid.Row="2" x:Name="lbxShop" ItemsSource="{Binding GlobalConfig.ShopLoginList}" BorderThickness="0" Margin="4,0,4,4">-->
<ListBox
x:Name="lbxShop"
Grid.Row="2"
Margin="4,0,4,4"
BorderThickness="0"
SelectionMode="Extended">
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!--<local:ShopListRowCtrl></local:ShopListRowCtrl>-->
<Border
MinHeight="50"
Margin="0,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
BorderBrush="{StaticResource ListRowBorderColorBrush}"
BorderThickness="0,0,0,1"
CornerRadius="0">
<Border.Style>
<!-- 鼠标进入或悬停Border时切换颜色(悬停时Border的填充控件必须有填充Border,所在层级不限,仅填充透明Grid则触发器无效) -->
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource ListRowHoverBackColorBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid x:Name="gridSearch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Margin="6,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="店名" />
<Border
Grid.Column="1"
Height="26"
Margin="4"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
CornerRadius="4">
<TextBox
x:Name="txtShopName"
Margin="3,0"
VerticalContentAlignment="Center"
Style="{StaticResource BaseTextBoxStyle}" />
</Border>
<TextBlock
Grid.Column="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="分组" />
<Border
Grid.Column="3"
Height="26"
Margin="4"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
CornerRadius="4">
<ComboBox
x:Name="cmbGroup"
Margin="3,0"
VerticalContentAlignment="Center"
SelectionChanged="cmbGroup_SelectionChanged"
Style="{StaticResource BaseComboBoxStyle}" />
</Border>
<TextBlock
Grid.Column="4"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="备注" />
<Border
Grid.Column="5"
Height="26"
Margin="4"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
CornerRadius="4">
<ComboBox
x:Name="cmbNotes"
Margin="3,0"
VerticalContentAlignment="Center"
SelectionChanged="cmbNotes_SelectionChanged"
Style="{StaticResource BaseComboBoxStyle}" />
</Border>
<Button
x:Name="btnSearch"
Grid.Row="4"
Grid.Column="6"
Height="26"
Click="btnSearch_Click"
Content=" 搜索 "
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnRestore"
Grid.Row="4"
Grid.Column="7"
Height="26"
Margin="4,0,6,0"
Click="btnRestore_Click"
Content=" 还原 "
Style="{StaticResource BasePageButtonLightStyle}" />
</Grid>
<Grid
x:Name="lstTitle"
Grid.Row="1"
Margin="4,0"
Background="{StaticResource ListHeadBackColorBrush}">
<Border BorderBrush="{StaticResource ListHeadBorderColorBrush}" BorderThickness="0,0,1,0">
<DataGrid
x:Name="dgShopHeader"
Grid.ColumnSpan="100"
Margin="0,0,18,0"
AutoGenerateColumns="False"
BorderThickness="0"
CanUserReorderColumns="False"
ColumnDisplayIndexChanged="dgShopHeader_ColumnDisplayIndexChanged"
ColumnHeaderHeight="{Binding ElementName=lstTitle, Path=ActualHeight}"
LayoutUpdated="dgShopHeader_LayoutUpdated">
<DataGrid.Columns>
<DataGridTemplateColumn
x:Name="colSelectAll"
Width="50"
Header="选择"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<Grid Width="14" Height="14">
<!--<CheckBox x:Name="headerCheckBox" BorderThickness="0" IsChecked="{Binding DataContext.AreAllSelected, RelativeSource={RelativeSource AncestorType=DataGrid}, UpdateSourceTrigger=PropertyChanged}" Checked="HeaderCheckBox_Checked" Unchecked="HeaderCheckBox_Unchecked"/>-->
<CheckBox
x:Name="chkSelectAll"
BorderThickness="0"
Checked="ChkSelectAll_Checked"
IsChecked="False"
IsThreeState="True"
Loaded="ChkSelectAll_Loaded"
Unchecked="ChkSelectAll_Unchecked" />
<Border
Width="14"
Height="14"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
BorderBrush="{StaticResource mainColorBrush}"
BorderThickness="1"
IsHitTestVisible="False" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!--<CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center"/>-->
<CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn
Width="50*"
Header="序号"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="100*"
Header="AppId"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="100*"
Header="店铺编号"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="100*"
Header="店铺名称"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="100*"
Header="分组"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
<DataGridTextColumn
Width="82*"
Header=" 备注"
HeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}" />
</DataGrid.Columns>
</DataGrid>
</Border>
</Grid>
<!--<ListBox Grid.Row="2" x:Name="lbxShop" ItemsSource="{Binding GlobalConfig.ShopLoginList}" BorderThickness="0" Margin="4,0,4,4">-->
<ListBox
x:Name="lbxShop"
Grid.Row="2"
Margin="4,0,4,4"
BorderThickness="0"
SelectionMode="Extended">
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!--<local:ShopListRowCtrl></local:ShopListRowCtrl>-->
<Border
MinHeight="50"
Margin="0,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
BorderBrush="{StaticResource ListRowBorderColorBrush}"
BorderThickness="0,0,0,1"
CornerRadius="0">
<Border.Style>
<!-- 鼠标进入或悬停Border时切换颜色(悬停时Border的填充控件必须有填充Border,所在层级不限,仅填充透明Grid则触发器无效) -->
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource ListRowHoverBackColorBrush}" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid x:Name="gridListItem">
<Grid.ColumnDefinitions>
<!--<ColumnDefinition Width="{Binding colShopIdWidth,RelativeSource={RelativeSource AncestorType={x:Type local:ShopListCtrl}}}" ></ColumnDefinition>-->
<ColumnDefinition x:Name="colCheck" Width="100*" />
<ColumnDefinition x:Name="colShopId" Width="100*" />
<ColumnDefinition x:Name="colShopName" Width="100*" />
<ColumnDefinition x:Name="colGroupName" Width="100*" />
<ColumnDefinition x:Name="colNotes" Width="100*" />
</Grid.ColumnDefinitions>
<CheckBox
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
Click="CheckBox_Click"
IsChecked="{Binding IsSelect, Mode=TwoWay}"
Tag="{Binding ShopId}" />
<TextBox
Grid.Column="1"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding ShopId}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="2"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding ShopAccount}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="3"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding GroupName}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="4"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding Notes}"
TextWrapping="Wrap" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Grid x:Name="gridListItem">
<Grid.ColumnDefinitions>
<!--<ColumnDefinition Width="{Binding colShopIdWidth,RelativeSource={RelativeSource AncestorType={x:Type local:ShopListCtrl}}}" ></ColumnDefinition>-->
<ColumnDefinition x:Name="colCheck" Width="50*" />
<ColumnDefinition x:Name="colIndex" Width="50*" />
<ColumnDefinition x:Name="colAppId" Width="100*" />
<ColumnDefinition x:Name="colShopId" Width="100*" />
<ColumnDefinition x:Name="colShopName" Width="100*" />
<ColumnDefinition x:Name="colGroupName" Width="100*" />
<ColumnDefinition x:Name="colNotes" Width="100*" />
</Grid.ColumnDefinitions>
<CheckBox
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
Click="CheckBox_Click"
IsChecked="{Binding IsSelect, Mode=TwoWay}"
Tag="{Binding ShopId}" />
<TextBox
Grid.Column="1"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Converter={StaticResource listBoxIndexConverter}}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="2"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding ShopId}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="3"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ErpShopId}"
Text="{Binding ErpShopId}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="4"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding ShopAccount}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="5"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding GroupName}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="6"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Tag="{Binding ShopId}"
Text="{Binding Notes}"
TextWrapping="Wrap" />
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Grid x:Name="gridRefreshOrSelect" Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button
x:Name="btnRefreshShop"
Grid.Row="4"
Grid.Column="0"
Height="26"
Margin="6,0,0,0"
Click="btnRefreshShop_Click"
Content=" 刷新店铺 "
Style="{StaticResource BasePageButtonStyle}" />
<Grid x:Name="gridRefreshOrSelect" Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button
x:Name="btnRefreshShop"
Grid.Row="4"
Grid.Column="0"
Height="26"
Margin="6,0,0,0"
Click="btnRefreshShop_Click"
Content=" 刷新店铺 "
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnApplySelectShop"
Grid.Row="4"
Grid.Column="6"
Height="26"
Click="btnApplySelectShop_Click"
Content=" 确定 "
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnCancelSelectShop"
Grid.Row="4"
Grid.Column="7"
Height="26"
Margin="4,0,6,0"
Click="btnCancelSelectShop_Click"
Content=" 取消 "
Style="{StaticResource BasePageButtonLightStyle}" />
</Grid>
</Grid>
<Button
x:Name="btnApplySelectShop"
Grid.Row="4"
Grid.Column="6"
Height="26"
Click="btnApplySelectShop_Click"
Content=" 确定 "
Style="{StaticResource BasePageButtonStyle}" />
<Button
x:Name="btnCancelSelectShop"
Grid.Row="4"
Grid.Column="7"
Height="26"
Margin="4,0,6,0"
Click="btnCancelSelectShop_Click"
Content=" 取消 "
Style="{StaticResource BasePageButtonLightStyle}" />
</Grid>
</Grid>
</UserControl>
@@ -1,156 +1,246 @@
using Newtonsoft.Json;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using WPFCommon.Models;
namespace _29WxOrderWpf.Ctrls.Statistics.Models
{
/// <summary>
/// 店铺营收统计 - 查询参数
/// 店铺营收统计 - 查询参数。
/// 对应新接口 shop_revenue_statistics/get_shop_order_amount 与
/// shop_revenue_statistics/get_shop_stats_details 的请求体(StartDate / EndDate / ShopIds)。
/// </summary>
public class ShopRevenueStatisticsQuery
{
/// <summary>开始时间</summary>
/// <summary>开始日期</summary>
public DateTime StartDate { get; set; }
/// <summary>结束时间</summary>
/// <summary>结束日期</summary>
public DateTime EndDate { get; set; }
/// <summary>选中的店铺 app_key 列表;空/Null 表示全部店铺</summary>
public List<string> ShopKeys { get; set; }
/// <summary>
/// 选中的店铺 ERP 店铺ID(ShopLoginInfo.ErpShopId)列表;
/// 空/Null 表示全部店铺(服务层会取全部店铺的 ErpShopId)。
/// </summary>
public List<string> ShopIds { get; set; }
}
/// <summary>
/// 店铺营收统计 - 接口返回的原始明细行。
/// 与后端 WXOrderAmountInfo 保持一致(camelCase JSON):
/// shopName, createTime, orderId, status, productPrice, orderPrice, purchasePrice, freight,
/// predictCommissionFee, commissionAmount, discountedPrice, profit, purchaseStatus,
/// outAmount, refundStatus, refundStatusString, refundAmount, externalProcurement
/// 金额字段单位均为分(显示时需除以 100)。
/// 店铺统计记录(接口返回)。
/// 接口返回结构:
/// shop_revenue_statistics/GetShopStats -> Result&lt;Dictionary&lt;string, List&lt;ShopStatsResponse&gt;&gt;&gt;
/// Key = 店铺ID,Value = 该店铺按 <see cref="ShopStatsGroupType"/> 聚合后的记录列表
/// (汇总=1 条;天/周/月=每个自然日/自然周/自然月各 1 条)。
/// 注意:接口只返回按 GroupType 聚合后的记录,不返回“整段汇总”,
/// 页面上的汇总卡片由客户端对返回记录自行合计(GroupType=Summary 时每店铺一条,直接相加即可)。
/// 金额字段单位均为“分”,显示时需除以 100 转为元。
/// </summary>
public class ShopRevenueStatisticsRow
public class ShopStatsResponse
{
/// <summary>
/// 店铺名称
/// 店铺ID
/// </summary>
[JsonProperty("shop_name")]
public string ShopName { get; set; }
public string ShopId { get; set; }
/// <summary>
/// 下单时间(秒级时间戳)
/// 销售订单创建日期
/// </summary>
[JsonProperty("create_time")]
[JsonConverter(typeof(UnixDateTimeConverter))]
public DateTime CreateTime { get; set; }
public DateTime StatDate { get; set; }
/// <summary>
/// 订单号
/// 订单数(有效订单,不含退款订单)
/// </summary>
[JsonProperty("order_id")]
public string OrderId { get; set; }
public int OrderCount { get; set; }
/// <summary>
/// 订单状态
/// 销售总额(分)
/// </summary>
[JsonProperty("status")]
public int Status { get; set; }
/// <summary>
/// 商品总价(分)
/// </summary>
[JsonProperty("product_price")]
public int ProductPrice { get; set; }
/// <summary>
/// 订单金额(分)
/// </summary>
[JsonProperty("order_price")]
public int OrderPrice { get; set; }
/// <summary>
/// 采购价(分)
/// </summary>
[JsonProperty("purchase_price")]
public int PurchasePrice { get; set; }
/// <summary>
/// 运费(分)
/// </summary>
[JsonProperty("freight")]
public int Freight { get; set; }
/// <summary>
/// 平台服务费(预计技术服务费,分)
/// </summary>
[JsonProperty("predict_commission_fee")]
public int PredictCommissionFee { get; set; }
/// <summary>
/// 达人佣金(分)
/// </summary>
[JsonProperty("commission_amount")]
public int CommissionAmount { get; set; }
/// <summary>
/// 优惠金额(分)
/// </summary>
[JsonProperty("discounted_price")]
public int DiscountedPrice { get; set; }
public long SalesAmount { get; set; }
/// <summary>
/// 利润(分)
/// </summary>
[JsonProperty("profit")]
public int Profit { get; set; }
public long ProfitAmount { get; set; }
/// <summary>
/// 采购状态
/// 平台佣金(分)
/// </summary>
[JsonProperty("purchase_status")]
public int PurchaseStatus { get; set; }
public long PlatformFee { get; set; }
/// <summary>
/// 外采金额(分),out_amount为空或0时从中转仓订单表补全
/// 退款订单数
/// </summary>
public int RefundOrderCount { get; set; }
/// <summary>
/// 已成功退款金额(分,店铺端已退款成功)
/// </summary>
public long RefundDone { get; set; }
/// <summary>
/// 退款处理中金额(分,店铺端退款中)
/// </summary>
public long RefundPending { get; set; }
/// <summary>
/// 采购单数
/// </summary>
public int PurchaseCount { get; set; }
/// <summary>
/// 总花费金额(分,买手号采购付款金额)
/// </summary>
public long TotalPurchase { get; set; }
/// <summary>
/// 售后中买手总金额(分)
/// </summary>
public long TotalRefund => DoneRefund + PendingRefund + RejectedRefund;
/// <summary>
/// 已成功退款金额(分,买手号采购退款成功)
/// </summary>
public long DoneRefund { get; set; }
/// <summary>
/// 未退回金额(分)
/// </summary>
public long PendingRefund { get; set; }
/// <summary>
/// 被拒绝金额(分)
/// </summary>
public long RejectedRefund { get; set; }
}
/// <summary>
/// 销售趋势记录(接口返回):跨店铺合计后的按天趋势,供综合统计页的销售趋势折线图使用。
/// 接口返回结构:
/// shop_revenue_statistics/GetShopStatsTrend
/// -> Result&lt;List&lt;ShopStatsTrendResponse&gt;&gt;
/// 请求参数:StartDate / EndDate / ShopIds(不需要 GroupType,固定按天返回)。
/// 金额字段单位为“分”,显示时需除以 100 转为元。
/// </summary>
public class ShopStatsTrendResponse
{
/// <summary>
/// 统计日期(天)
/// </summary>
public DateTime StatDate { get; set; }
/// <summary>
/// 销售额(分)
/// </summary>
public long SalesAmount { get; set; }
/// <summary>
/// 订单数
/// </summary>
public int OrderCount { get; set; }
}
/// <summary>
/// 订单明细(接口返回):订单列表弹窗 ShowOrderDialogView 的数据行。
/// 接口返回结构:
/// shop_revenue_statistics/GetShopOrderDetails
/// -> Result&lt;List&lt;ShopOrderDetailResponse&gt;&gt;
/// 请求参数:StartDate / EndDate / ShopIds / OrderType(见 <see cref="ShopOrderDetailType"/>)。
/// 金额字段单位均为“分”,显示时需除以 100 转为元。
/// </summary>
public class ShopOrderDetailResponse
{
/// <summary>
/// 店铺ID
/// </summary>
public long ShopId { get; set; }
/// <summary>
/// 店铺名称
/// </summary>
public string ShopName { get; set; }
/// <summary>
/// 商铺订单号
/// </summary>
public string OrderId { get; set; }
/// <summary>
/// 订单创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 订单金额(分)
/// </summary>
public int OrderPrice { get; set; }
/// <summary>
/// 订单退款金额(分),即商铺订单商品明细的退款金额之和;有效订单为 0
/// </summary>
public int OrderRefundAmount { get; set; }
/// <summary>
/// 利润
/// </summary>
public long ProfitAmount { get; set; }
/// <summary>
/// 平台佣金
/// </summary>
public long PlatformFee { get; set; }
/// <summary>
/// 外采金额(分),即该订单下所有买手订单的购买金额之和
/// </summary>
[JsonProperty("out_amount")]
public int OutAmount { get; set; }
/// <summary>
/// 售后状态(订单明细 refund_status)
/// 买手未退回金额(分),即买手订单中退款未成功的退款金额之和;无售后时为 0
/// </summary>
[JsonProperty("refund_status")]
public int RefundStatus { get; set; }
public int UnrefundedAmount { get; set; }
/// <summary>
/// 售后状态(退款单 status)
/// 买手订单信息(一个订单号对应多个买手订单)
/// </summary>
[JsonProperty("refund_status_string")]
public string RefundStatusString { get; set; }
public List<BuyerOrderInfo> BuyerOrders { get; set; } = new List<BuyerOrderInfo>();
}
/// <summary>
/// 买手订单信息(订单明细下的子项,一个商铺订单可对应多个买手订单)
/// </summary>
public class BuyerOrderInfo
{
/// <summary>
/// 买手订单ID
/// </summary>
public long Id { get; set; }
/// <summary>
/// 仓库类型 0,1直发
/// </summary>
public int PurchaseType { get; set; }
/// <summary>
/// 外部订单(买手订单)号
/// </summary>
public string OutOrderSn { get; set; }
/// <summary>
/// 售后退款金额(分)
/// 金额(分)
/// </summary>
public int OutAmount { get; set; }
public long RefundId { get; set; }
/// <summary>
/// 退款金额(分)
/// </summary>
[JsonProperty("refund_amount")]
public int RefundAmount { get; set; }
/// <summary>
/// 是否外采:0=未从中转仓订单表查到,1=查到
/// 退款状态
/// </summary>
[JsonProperty("external_procurement")]
public int ExternalProcurement { get; set; }
/// <summary>
/// 买手退款金额
/// </summary>
[JsonProperty("buyer_refund_amount")]
public int BuyerRefundAmount { get; set; }
/// <summary>
/// 买手退款状态
/// </summary>
[JsonProperty("buyer_refund_status")]
public string BuyerRefundStatus { get; set; }
public string RefundStatusText { get; set; }
public DateTime CreateTime { get; set; }
public string Remark { get; set; }
}
/// <summary>
@@ -166,7 +256,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
/// <summary>利润(实际利润)</summary>
public decimal Profit { get; set; }
/// <summary>退款金额(统计期间退款)</summary>
/// <summary>退款金额(统计期间店铺端退款:已成功 + 处理中)</summary>
public decimal RefundAmount { get; set; }
/// <summary>退款订单数</summary>
@@ -175,7 +265,10 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
/// <summary>平台服务费总额(元)</summary>
public decimal PlatformFeeTotal { get; set; }
/// <summary>达人佣金(元)</summary>
/// <summary>
/// 达人佣金(元)。
/// 新接口未提供该字段,固定为 0,保留属性与页面展示,待后端补充字段后直接接上。
/// </summary>
public decimal Commission { get; set; }
/// <summary>客单价(平均每单金额)</summary>
@@ -238,7 +331,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
/// <summary>店铺名称</summary>
public string ShopName { get; set; }
/// <summary>订单数</summary>
/// <summary>订单数(有效订单,不含退款订单)</summary>
public int OrderCount { get; set; }
/// <summary>销售额(元)</summary>
@@ -254,7 +347,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
/// <summary>平台服务费总额(元)</summary>
public decimal PlatformFeeTotal { get; set; }
/// <summary>达人佣金(元)</summary>
/// <summary>达人佣金(元)。新接口未提供该字段,固定为 0。</summary>
public decimal Commission { get; set; }
/// <summary>客单价(元)</summary>
@@ -279,6 +372,55 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
Month = 2
}
/// <summary>
/// 接口聚合方式(请求参数 GroupType,按数字传值)。
/// 每种方式都返回 Dictionary&lt;店铺ID, List&lt;ShopStatsResponse&gt;&gt;:
/// 汇总时每个店铺 1 条,天/周/月时每个店铺每个周期 1 条。
/// </summary>
public enum ShopStatsGroupType
{
/// <summary>
/// 汇总:每个商铺只返回一条(整个查询范围合计)
/// </summary>
Summary = 0,
/// <summary>
/// 天:按自然日聚合,每个商铺每天一条
/// </summary>
Day = 1,
/// <summary>
/// 周:按自然周聚合(周一为一周开始),每个商铺每周一条
/// </summary>
Week = 2,
/// <summary>
/// 月:按自然月聚合,每个商铺每月一条
/// </summary>
Month = 3
}
/// <summary>
/// 订单明细类型(订单列表弹窗的入口类型,对应接口参数 OrderType,按数字传值)。
/// 数值与后端枚举保持一致:有效订单=1、退款订单=2、买手未退回金额的订单=3
/// (后端枚举里的“全部订单 All=0”本页不使用,故不定义)。
/// </summary>
public enum ShopOrderDetailType
{
/// <summary>有效订单:没有发生售后的订单(对应统计里的订单数 / 销售额 / 利润口径)</summary>
Valid = 1,
/// <summary>退款订单:发生过售后的订单(对应统计里的退款订单数口径)</summary>
Refund = 2,
/// <summary>买手未退回金额的订单:退款订单中买手款项还没退回的(对应统计里的未退回金额口径)</summary>
BuyerUnrefunded = 3,
/// <summary>
/// 利润订单 有效订单+退款订单利润>0
/// </summary>
Profit = 4,
}
/// <summary>
/// 天/周/月周期统计表格行(金额单位:元)。
/// 按所选店铺(或全部店铺)统计:天统计每天一行;周统计每周一行;月统计每月一行。
@@ -291,7 +433,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
/// <summary>周期显示文本(天:yyyy-MM-dd;周:yyyy-MM-dd ~ yyyy-MM-dd;月:yyyy-MM)</summary>
public string Period { get; set; }
/// <summary>订单数</summary>
/// <summary>订单数(有效订单,不含退款订单)</summary>
public int OrderCount { get; set; }
/// <summary>销售额(元)</summary>
@@ -308,7 +450,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
/// <summary>平台服务费总额(元)</summary>
public decimal PlatformFeeTotal { get; set; }
/// <summary>达人佣金(元)</summary>
/// <summary>达人佣金(元)。新接口未提供该字段,固定为 0。</summary>
public decimal Commission { get; set; }
/// <summary>平均利润率(利润 / 采购金额,百分数,如 12.34 表示 12.34%)</summary>
@@ -321,14 +463,51 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
public decimal AvgOrderAmount { get; set; }
}
/// <summary>
/// 店铺营收统计 - 一次查询的全部聚合结果(综合统计页使用)。
/// 由两次请求组成:
/// shop_revenue_statistics/GetShopStats(GroupType=Summary)-> 卡片/店铺统计表/销售占比(每店铺一条,与区间长度无关)
/// shop_revenue_statistics/GetShopStatsTrend -> 销售趋势(跨店铺合计的按天序列)
/// </summary>
public class ShopRevenueStatisticsResult
{
/// <summary>汇总卡片数据</summary>
public ShopRevenueSummary Summary { get; set; }
/// <summary>销售趋势(按天,缺失日期补 0)</summary>
public List<RevenueTrendPoint> Trend { get; set; }
/// <summary>店铺销售占比(饼图)</summary>
public List<ShopSalesProportionItem> ShopProportions { get; set; }
/// <summary>店铺统计表格</summary>
public List<ShopStatisticsItem> ShopStatistics { get; set; }
}
/// <summary>
/// 店铺营收统计 - 天/周/月周期统计查询结果(周期统计页使用)。
/// 接口不返回整段汇总,Summary 由返回的周期数据在客户端合计得出。
/// </summary>
public class ShopPeriodStatisticsResult
{
/// <summary>汇总卡片数据(整个查询时间段,客户端合计)</summary>
public ShopRevenueSummary Summary { get; set; }
/// <summary>周期统计表格(天/周/月各一行)</summary>
public List<ShopPeriodStatisticsItem> Items { get; set; }
}
/// <summary>
/// 店铺下拉选项
/// </summary>
public class ShopOption
{
/// <summary>店铺 app_key(A.app_key)</summary>
public string AppKey { get; set; }
/// <summary>店铺ID(ShopLoginInfo.ShopId)</summary>
public string ShopId { get; set; }
/// <summary>ERP 店铺ID(ShopLoginInfo.ErpShopId),统计接口的 ShopIds 使用该字段</summary>
public string ErpShopId { get; set; }
/// <summary>店铺名称</summary>
public string ShopName { get; set; }
}
@@ -345,55 +524,4 @@ namespace _29WxOrderWpf.Ctrls.Statistics.Models
public string Value { get; set; }
}
class UnixDateTimeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// 读取数值(支持 long 和 int 类型)
if (reader.TokenType == JsonToken.Integer)
{
long milliseconds = (long)reader.Value;
// Unix 纪元:1970-01-01 UTC
//DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime epoch = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
if (milliseconds.ToString().Length == 13)
{
return epoch.AddMilliseconds(milliseconds);
}
return epoch.AddSeconds(milliseconds);
}
// 如果传入的是字符串(如 "1700000000000"),也支持
else if (reader.TokenType == JsonToken.String)
{
if (long.TryParse((string)reader.Value, out long milliseconds))
{
//DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime epoch = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
if (milliseconds.ToString().Length == 13)
{
return epoch.AddMilliseconds(milliseconds);
}
return epoch.AddSeconds(milliseconds);
}
}
throw new JsonSerializationException($"无法将 {reader.Value} 转换为 DateTime");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// 序列化时转回时间戳
//DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime epoch = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long milliseconds = (long)((DateTime)value - epoch).TotalMilliseconds;
writer.WriteValue(milliseconds);
}
}
}
@@ -2,7 +2,7 @@
x:Class="_29WxOrderWpf.Ctrls.Statistics.PeriodRevenueStatisticsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:common="clr-namespace:_29WxOrderWpf.Common"
xmlns:common="WxOrder.Framework"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:stat="clr-namespace:_29WxOrderWpf.Ctrls.Statistics"
@@ -80,20 +80,6 @@
</StackPanel>
</Border>
<Button
Height="16"
Margin="10"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Command="{Binding ShowOrderListCommand}"
CommandParameter="ValidOrderCount"
Foreground="{StaticResource pageColorBrush}"
Style="{StaticResource IconButtonStyle}">
<TextBlock
FontSize="24"
Style="{StaticResource TextBlockIcon}"
Text="{StaticResource txt-more_horizontal}" />
</Button>
</Grid>
<!-- 采购金额 -->
<Border Style="{StaticResource CardBorderStyle}">
@@ -117,25 +103,37 @@
</Border>
<!-- 利润 -->
<Border Style="{StaticResource CardBorderStyle}">
<StackPanel>
<TextBlock
FontSize="14"
Foreground="#888888"
Text="利润" />
<TextBlock
Margin="0,12,0,0"
FontSize="30"
FontWeight="Bold"
Foreground="#333333"
Text="{Binding Summary.Profit, StringFormat={}¥{0:N2}}" />
<TextBlock
Margin="0,10,0,0"
FontSize="12"
Foreground="#999999"
Text="实际利润" />
</StackPanel>
</Border>
<Grid>
<Border Style="{StaticResource CardBorderStyle}">
<StackPanel>
<TextBlock
FontSize="14"
Foreground="#888888"
Text="利润" />
<TextBlock
Margin="0,12,0,0"
FontSize="30"
FontWeight="Bold"
Foreground="#333333"
Text="{Binding Summary.Profit, StringFormat={}¥{0:N2}}" />
<TextBlock
Margin="0,10,0,0"
FontSize="12"
Foreground="#999999"
Text="实际利润" />
</StackPanel>
</Border>
<Button
Margin="10"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Command="{Binding ShowOrderListCommand}"
CommandParameter="ProfitOrder"
Content="明细"
FontSize="12"
Foreground="{StaticResource pageColorBrush}"
Style="{StaticResource IconButtonStyle}" />
</Grid>
<!-- 平均利润率 -->
<Border Style="{StaticResource CardBorderStyle}">
<StackPanel>
@@ -242,19 +240,15 @@
</StackPanel>
</Border>
<Button
Height="16"
Margin="10"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Command="{Binding ShowOrderListCommand}"
CommandParameter="RefundOrderCount"
Content="明细"
FontSize="12"
Foreground="{StaticResource pageColorBrush}"
Style="{StaticResource IconButtonStyle}">
<TextBlock
FontSize="24"
Style="{StaticResource TextBlockIcon}"
Text="{StaticResource txt-more_horizontal}" />
</Button>
Style="{StaticResource IconButtonStyle}" />
</Grid>
<!-- 采购退款成功金额 -->
@@ -263,7 +257,7 @@
<TextBlock
FontSize="14"
Foreground="#888888"
Text="总采购金额" />
Text="售后采购金额" />
<TextBlock
Margin="0,12,0,0"
FontSize="30"
@@ -321,19 +315,15 @@
</StackPanel>
</Border>
<Button
Height="16"
Margin="10"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Command="{Binding ShowOrderListCommand}"
CommandParameter="BuyerRefundRemainingAmount"
Content="明细"
FontSize="12"
Foreground="{StaticResource pageColorBrush}"
Style="{StaticResource IconButtonStyle}">
<TextBlock
FontSize="24"
Style="{StaticResource TextBlockIcon}"
Text="{StaticResource txt-more_horizontal}" />
</Button>
Style="{StaticResource IconButtonStyle}" />
</Grid>
<!-- 退款率 -->
@@ -13,5 +13,6 @@ namespace _29WxOrderWpf.Ctrls.Statistics
{
InitializeComponent();
}
}
}
File diff suppressed because it is too large. Load diff
@@ -1,4 +1,4 @@
<UserControl
<Window
x:Class="_29WxOrderWpf.Ctrls.Statistics.ShopRevenueStatisticsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
@@ -7,16 +7,16 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:stat="clr-namespace:_29WxOrderWpf.Ctrls.Statistics"
xmlns:vm="clr-namespace:_29WxOrderWpf.Ctrls.Statistics.ViewModels"
xmlns:wpf="clr-namespace:_29WxOrderWpf.Common"
xmlns:wpf="WxOrder.Framework"
Width="1600"
d:Background="#F5F7FB"
d:DataContext="{d:DesignInstance Type=vm:ShopRevenueStatisticsViewModel,
IsDesignTimeCreatable=True}"
d:DesignHeight="900"
d:DesignWidth="1600"
wpf:DialogWindowProperty.ResizeMode="CanResizeWithGrip"
wpf:DialogWindowProperty.ShowMinButton="False"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<UserControl.Resources>
<Window.Resources>
<BooleanToVisibilityConverter x:Key="boolToVisibilityConverter" />
<!-- 卡片样式(白底、圆角、阴影) -->
@@ -119,7 +119,7 @@
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
</Window.Resources>
<Grid Background="#F5F7FB">
<TabControl SelectionChanged="TabControl_SelectionChanged" Style="{StaticResource StatisticsTabControlStyle}">
@@ -348,4 +348,4 @@
</StackPanel>
</Border>
</Grid>
</UserControl>
</Window>
@@ -1,4 +1,5 @@
using System.Windows.Controls;
using System.Windows;
using System.Windows.Controls;
using _29WxOrderWpf.Ctrls.Statistics.ViewModels;
namespace _29WxOrderWpf.Ctrls.Statistics
@@ -9,7 +10,7 @@ namespace _29WxOrderWpf.Ctrls.Statistics
/// 如需注入自定义数据服务,请使用
/// new ShopRevenueStatisticsView(new ShopRevenueStatisticsViewModel(你的 IShopRevenueStatisticsService 实现))。
/// </summary>
public partial class ShopRevenueStatisticsView : UserControl
public partial class ShopRevenueStatisticsView : Window
{
public ShopRevenueStatisticsView()
: this(new ShopRevenueStatisticsViewModel())
@@ -19,7 +20,9 @@ namespace _29WxOrderWpf.Ctrls.Statistics
public ShopRevenueStatisticsView(ShopRevenueStatisticsViewModel viewModel)
{
InitializeComponent();
viewModel.GetWindow = () => this;
DataContext = viewModel;
}
private void help_mouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
@@ -1,26 +1,72 @@
<UserControl
<UserControl
x:Class="_29WxOrderWpf.Ctrls.Statistics.ShowOrderDialogView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:comn="WxOrder.Framework"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Ctrls.Statistics"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wpf="WPFCommon"
comn:DialogWindowProperty.Height="620"
comn:DialogWindowProperty.ResizeMode="CanResizeWithGrip"
comn:DialogWindowProperty.Width="1320"
d:Background="White"
d:DesignHeight="450"
d:DesignWidth="800"
d:DesignWidth="1000"
Focusable="True"
PreviewKeyDown="ShowOrderDialogView_PreviewKeyDown"
mc:Ignorable="d">
<UserControl.Resources>
<wpf:BindingProxy x:Key="ViewModel" Data="{Binding}" />
<!-- 单元格文字居中 -->
<Style x:Key="CenterCellTextStyle" TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<!--
选中行高亮:用主题色填充选中行,并且不区分表格是否拥有焦点
(默认样式的选中色在焦点离开表格后会变成浅灰,点了“复制数据”就看不出选中了哪些行)
-->
<Style x:Key="SelectedCellStyle" TargetType="DataGridCell">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource pageColorBrush}" />
<Setter Property="Foreground" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border
Grid.Row="0"
Padding="10"
BorderBrush="Gray"
BorderThickness="0,0,0,1">
<wpf:SpacingStackPanel HorizontalSpacing="10" Orientation="Horizontal">
<wpf:TitleContent
Title="订单号:"
Width="180"
Placement="Left"
TitleVerticalAlignment="Center">
<TextBox
Height="22"
Text="{Binding OrderId, UpdateSourceTrigger=PropertyChanged}"
ToolTip="按订单号筛选;表格内可用 Ctrl+A 全选、Ctrl+C 复制数据" />
</wpf:TitleContent>
</wpf:SpacingStackPanel>
</Border>
<DataGrid
x:Name="dgOrders"
Grid.Row="1"
d:ItemsSource="{d:SampleData ItemCount=10}"
AlternatingRowBackground="#FAFAFA"
AutoGenerateColumns="False"
@@ -30,14 +76,15 @@
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
CellStyle="{StaticResource SelectedCellStyle}"
ColumnHeaderStyle="{StaticResource BaseDataGridColumnHeaderStyle}"
GridLinesVisibility="Horizontal"
HeadersVisibility="Column"
HorizontalGridLinesBrush="#EEEEEE"
IsReadOnly="True"
ItemsSource="{Binding Data}"
ItemsSource="{Binding DataView}"
RowHeight="44"
SelectionMode="Single"
SelectionMode="Extended"
SelectionUnit="FullRow"
VerticalScrollBarVisibility="Auto">
<DataGrid.Columns>
@@ -63,7 +110,6 @@
<Button
Margin="5,0,0,0"
Click="CopyOrderId_Click"
Foreground="{StaticResource pageColorBrush}"
ToolTip="复制订单号">
<Button.Style>
<Style BasedOn="{StaticResource IconButtonStyle}" TargetType="Button">
@@ -83,6 +129,13 @@
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- 创建时间 -->
<DataGridTextColumn
Width="1.4*"
Binding="{Binding CreateTime, StringFormat={}{0:yyyy-MM-dd HH:mm}}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="创建时间" />
<!-- 金额(分转元) -->
<DataGridTextColumn
Width="*"
@@ -91,14 +144,94 @@
Header="金额" />
<DataGridTextColumn
Width="*"
Binding="{Binding RefundAmount, Converter={StaticResource FenToYuanConverter}, StringFormat={}¥{0:N2}}"
Binding="{Binding OrderRefundAmount, Converter={StaticResource FenToYuanConverter}, StringFormat={}¥{0:N2}}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="退款金额" />
<DataGridTextColumn
Width="*"
Binding="{Binding OutAmount, Converter={StaticResource FenToYuanConverter}, StringFormat={}¥{0:N2}}"
Binding="{Binding PlatformFee, Converter={StaticResource FenToYuanConverter}, StringFormat={}¥{0:N2}}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="平台费用" />
<DataGridTextColumn
Width="*"
Binding="{Binding ProfitAmount, Converter={StaticResource FenToYuanConverter}, StringFormat={}¥{0:N2}}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="利润" />
<!-- 买手订单:一笔买手订单占一行,不合并 -->
<DataGridTextColumn
Width="1.6*"
Binding="{Binding OutOrderSn}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="买手单号" />
<DataGridTextColumn
Width="*"
Binding="{Binding BuyerOutAmount, Converter={StaticResource FenToYuanConverter}, StringFormat={}¥{0:N2}}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="外采金额" />
<DataGridTextColumn
Width="*"
Binding="{Binding BuyerRefundAmount, Converter={StaticResource FenToYuanConverter}, StringFormat={}¥{0:N2}}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="买手退款" />
<DataGridTextColumn
Width="1.1*"
Binding="{Binding BuyerRefundStatusText}"
ElementStyle="{StaticResource CenterCellTextStyle}"
Header="退款状态" />
<DataGridTextColumn
Width="1.1*"
Binding="{Binding Remark}"
Header="备注"
Visibility="{Binding Source={StaticResource ViewModel}, Path=Data.IsBuyerUnrefunded, Converter={StaticResource Boolean2VisibilityConverter}}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="ToolTip" Value="{Binding Remark}" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!-- 操作:仅“买手未退回金额的订单”弹窗显示(列可见性在构造函数里按订单明细类型设置) -->
<DataGridTemplateColumn
x:Name="colUpdateRefund"
Width="*"
d:Visibility="Visible"
Header="操作"
Visibility="Collapsed">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button
HorizontalAlignment="Center"
VerticalAlignment="Center"
Command="{Binding Source={StaticResource ViewModel}, Path=Data.UpdateBuyerRefundStatusCommand}"
CommandParameter="{Binding}"
Content="确认成功"
Style="{StaticResource BasePageButtonLightStyle}"
ToolTip="把该笔买手订单标记为退款成功" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
x:Name="colRemark"
Width="*"
d:Visibility="Visible"
Header="操作"
Visibility="{Binding Source={StaticResource ViewModel}, Path=Data.IsBuyerUnrefunded, Converter={StaticResource Boolean2VisibilityConverter}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button
HorizontalAlignment="Center"
VerticalAlignment="Center"
Command="{Binding Source={StaticResource ViewModel}, Path=Data.UpdateRemarkCommand}"
CommandParameter="{Binding}"
Content="备注"
Style="{StaticResource BasePageButtonLightStyle}"
ToolTip="设置备注" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
@@ -1,11 +1,20 @@
using _29WxOrderWpf.Ctrls.Statistics.Models;
using _29WxOrderWpf.BaseWindows;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Ctrls.Statistics.Models;
using _29WxOrderWpf.Ctrls.Statistics.Services;
using _29WxOrderWpf.ToolCtrls;
using AllBase;
using NaiBa.Util.Extension;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
@@ -13,6 +22,8 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Work.BaseForms;
using WPFCommon.Models;
namespace _29WxOrderWpf.Ctrls.Statistics;
@@ -21,10 +32,44 @@ namespace _29WxOrderWpf.Ctrls.Statistics;
/// </summary>
public partial class ShowOrderDialogView : UserControl
{
public ShowOrderDialogView(List<ShopRevenueStatisticsRow> list)
private readonly KeyEventHandler shortcutKeyHandler;
public ShowOrderDialogView(List<ShopOrderDetailResponse> list, ShopOrderDetailType detailType, IShopRevenueStatisticsService statisticsService)
{
InitializeComponent();
this.DataContext = new ShowOrderDialogViewModel(list);
this.DataContext = new ShowOrderDialogViewModel(list, detailType, statisticsService);
// “操作”列(退款成功按钮)只在“买手未退回金额的订单”弹窗里显示
if (detailType == ShopOrderDetailType.BuyerUnrefunded)
{
colUpdateRefund.Visibility = Visibility.Visible;
//colRemark.Visibility = Visibility.Visible;
}
shortcutKeyHandler = ShowOrderDialogView_PreviewKeyDown;
// 快捷键必须挂到弹窗窗口上:弹窗刚打开时键盘焦点在窗口本身(不在本控件的可视树里),
// 事件路由中就不会有本控件,只在本控件上挂 PreviewKeyDown 的话,
// 必须先用鼠标点一下表格(焦点进到表格里)Ctrl+A/Ctrl+C 才会生效。
Loaded += (s, e) => AttachShortcutHandler();
Unloaded += (s, e) => DetachShortcutHandler();
}
/// <summary>把快捷键处理器挂到所在窗口(隧道事件,焦点在窗口上的任意位置都能收到)</summary>
private void AttachShortcutHandler()
{
Window window = Window.GetWindow(this);
if (window == null)
return;
// 先移除再挂,避免重复挂载后按一次键执行两次
window.RemoveHandler(PreviewKeyDownEvent, shortcutKeyHandler);
window.AddHandler(PreviewKeyDownEvent, shortcutKeyHandler);
}
private void DetachShortcutHandler()
{
Window.GetWindow(this)?.RemoveHandler(PreviewKeyDownEvent, shortcutKeyHandler);
}
/// <summary>
@@ -33,18 +78,380 @@ public partial class ShowOrderDialogView : UserControl
private void CopyOrderId_Click(object sender, RoutedEventArgs e)
{
if (sender is FrameworkElement element
&& element.DataContext is ShopRevenueStatisticsRow row
&& element.DataContext is ShopOrderDetailRow row
&& !string.IsNullOrEmpty(row.OrderId))
{
Clipboard.SetText(row.OrderId);
Window window = Window.GetWindow(this);
try
{
Clipboard.SetDataObject(row.OrderId);
ToastHelper.Show(window, "复制成功");
}
catch (Exception ex)
{
ToastHelper.Show(window, "复制失败 " + ex.Message, type: ToastType.Error);
}
}
}
}
class ShowOrderDialogViewModel
{
public List<ShopRevenueStatisticsRow> Data { get; set; }
public ShowOrderDialogViewModel(List<ShopRevenueStatisticsRow> list)
/// <summary>
/// 弹窗级快捷键:Ctrl+A 全选(筛选后显示的)行,Ctrl+C 复制数据。
/// 焦点在文本框里(如订单号搜索框)时不拦截,保留文本自身的 Ctrl+A/Ctrl+C/Ctrl+V 行为。
/// </summary>
private void ShowOrderDialogView_PreviewKeyDown(object sender, KeyEventArgs e)
{
Data = list ?? new List<ShopRevenueStatisticsRow>();
if (e.Handled || Keyboard.Modifiers != ModifierKeys.Control)
return;
// 文本框(含搜索框)优先,走文本自己的全选/复制/粘贴
if (Keyboard.FocusedElement is TextBoxBase)
return;
if (DataContext is not ShowOrderDialogViewModel viewModel)
return;
if (e.Key == Key.A)
{
SelectAllRows(viewModel);
e.Handled = true;
}
else if (e.Key == Key.C)
{
// 有选中就复制选中的行,没有选中则复制筛选后的全部数据
viewModel.CopyRows(GetSelectedRows());
e.Handled = true;
}
}
/// <summary>
/// Ctrl+A:全选当前筛选后显示的所有行(被过滤掉的行不会选中)。
/// 选中行取自与复制同一份筛选结果,保证“选中的”和“复制的”完全一致。
/// </summary>
private void SelectAllRows(ShowOrderDialogViewModel viewModel)
{
// 让键盘焦点回到表格,全选后仍可用键盘继续操作
dgOrders.Focus();
dgOrders.SelectedItems.Clear();
foreach (var row in viewModel.GetFilteredRows())
{
dgOrders.SelectedItems.Add(row);
}
}
/// <summary>当前选中的行</summary>
private List<ShopOrderDetailRow> GetSelectedRows()
{
return dgOrders.SelectedItems.OfType<ShopOrderDetailRow>().ToList();
}
}
/// <summary>
/// 订单明细表格行:把一个商铺订单按买手订单“展平”成多行(有几笔买手订单就几行,
/// 没有买手订单时占一行且买手字段为空),不把多笔买手订单合并到同一行。
/// 商铺订单级字段(店名/订单号/创建时间/金额等)在多行之间重复,保证每行都是一条完整记录。
/// </summary>
class ShopOrderDetailRow : BindableBaseEx
{
public string ShopName { get; set; }
public string OrderId { get; set; }
public DateTime CreateTime { get; set; }
public int OrderPrice { get; set; }
public int OrderRefundAmount { get; set; }
/// <summary>
/// 利润
/// </summary>
public long ProfitAmount { get; set; }
/// <summary>
/// 平台佣金
/// </summary>
public long PlatformFee { get; set; }
public int OutAmount { get; set; }
public int UnrefundedAmount { get; set; }
/// <summary>买手订单表ID</summary>
public long BuyerId { get; set; }
/// <summary>买手(外部)订单号;无买手订单时为空</summary>
public string OutOrderSn { get; set; }
/// <summary>买手订单金额(分)</summary>
public int BuyerOutAmount { get; set; }
/// <summary>
/// 买手退款表 id
/// </summary>
public long BuyerRefundId { get; set; }
/// <summary>买手订单退款金额(分)</summary>
public int BuyerRefundAmount { get; set; }
/// <summary>买手订单退款状态(更新成功后就地改为“退款成功”)</summary>
public string BuyerRefundStatusText
{
get => GetValue<string>();
set => SetValue(value);
}
public string Remark
{
get => GetValue<string>();
set => SetValue(value);
}
/// <summary>把接口返回的订单明细按买手订单展平成表格行</summary>
public static List<ShopOrderDetailRow> Flatten(IEnumerable<ShopOrderDetailResponse> list, ShopOrderDetailType detailType)
{
var rows = new List<ShopOrderDetailRow>();
if (list == null)
return rows;
foreach (var item in list)
{
if (item == null)
continue;
if (item.BuyerOrders == null || item.BuyerOrders.Count == 0)
{
rows.Add(Create(item, null));
continue;
}
if (detailType == ShopOrderDetailType.Profit)
{
// 利润订单只取最后一个买手订单
rows.Add(Create(item, item.BuyerOrders.LastOrDefault()));
}
else
{
foreach (var buyerOrder in item.BuyerOrders)
{
rows.Add(Create(item, buyerOrder));
}
}
}
return rows;
}
private static ShopOrderDetailRow Create(ShopOrderDetailResponse item, BuyerOrderInfo buyerOrder)
{
return new ShopOrderDetailRow
{
ShopName = item.ShopName,
OrderId = item.OrderId,
CreateTime = item.CreateTime,
OrderPrice = item.OrderPrice,
OrderRefundAmount = item.OrderRefundAmount,
ProfitAmount = item.ProfitAmount,
PlatformFee = item.PlatformFee,
OutAmount = item.OutAmount,
UnrefundedAmount = item.UnrefundedAmount,
BuyerId = buyerOrder == null ? 0 : buyerOrder.Id,
OutOrderSn = buyerOrder == null ? null : buyerOrder.OutOrderSn,
BuyerRefundId = buyerOrder == null ? 0 : buyerOrder.RefundId,
BuyerOutAmount = buyerOrder == null ? 0 : buyerOrder.OutAmount,
BuyerRefundAmount = buyerOrder == null ? 0 : buyerOrder.RefundAmount,
BuyerRefundStatusText = buyerOrder == null ? null : buyerOrder.RefundStatusText,
Remark = buyerOrder == null ? null : buyerOrder.Remark,
};
}
}
class ShowOrderDialogViewModel : BindableBaseEx
{
private readonly ShopOrderDetailType _detailType;
private readonly IShopRevenueStatisticsService _statisticsService;
public ObservableCollection<ShopOrderDetailRow> Data { get; set; }
public ICollectionView DataView { get; private set; }
public ShowOrderDialogViewModel(List<ShopOrderDetailResponse> list, ShopOrderDetailType detailType, IShopRevenueStatisticsService statisticsService)
{
IsBuyerUnrefunded = detailType == ShopOrderDetailType.BuyerUnrefunded;
// 按买手订单展平:一笔买手订单一一行, 利润明细合并,只展示一条
Data = new ObservableCollection<ShopOrderDetailRow>(ShopOrderDetailRow.Flatten(list, detailType));
DataView = CollectionViewSource.GetDefaultView(Data);
DataView.Filter = FilterRow;
_detailType = detailType;
_statisticsService = statisticsService;
}
private bool FilterRow(object obj)
{
if (string.IsNullOrWhiteSpace(OrderId))
return true;
if (obj is ShopOrderDetailRow row)
{
return (row.OrderId ?? string.Empty).Contains(OrderId);
}
return false;
}
public string OrderId
{
get => GetValue<string>();
set => SetValue(value, () => DataView.Refresh());
}
public bool IsBuyerUnrefunded
{
get => GetValue<bool>();
set => SetValue(value);
}
/// <summary>当前筛选后显示的行(按表格显示顺序)</summary>
public List<ShopOrderDetailRow> GetFilteredRows()
{
return DataView.Cast<ShopOrderDetailRow>().ToList();
}
/// <summary>
/// 复制指定行到剪贴板(带表头,制表符分隔)。
/// rows 为空时复制筛选后的全部数据;复制结果用提示条反馈。
/// </summary>
public void CopyRows(IEnumerable<ShopOrderDetailRow> rows)
{
List<ShopOrderDetailRow> list = rows?.ToList() ?? new List<ShopOrderDetailRow>();
if (list.Count == 0)
{
// 没有选中行时,复制筛选后的全部数据
list = GetFilteredRows();
}
if (list.Count == 0)
{
ToastHelper.Show("没有可复制的数据", type: ToastType.Warning);
return;
}
try
{
string text = BuildCopyText(list);
Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(text));
ToastHelper.Show("复制成功");
}
catch (Exception ex)
{
ToastHelper.Show("复制失败 " + ex.Message, type: ToastType.Error);
}
}
public ICommand UpdateBuyerRefundStatusCommand => new AsyncDelegateCommand<ShopOrderDetailRow>(UpdateBuyerRefundStatus);
private async Task UpdateBuyerRefundStatus(ShopOrderDetailRow row)
{
if (row.BuyerRefundId == 0)
{
ToastHelper.Show("该行缺少买手订单ID,无法更新", type: ToastType.Warning);
return;
}
var result = MessageBox.Show($"确定要把订单:{row.OrderId}\n设为已退款成功状态?", "提示",
MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result != MessageBoxResult.Yes)
{
return;
}
try
{
var ret = await _statisticsService.UpdateBuyerRefundStatusAsync(row.BuyerRefundId);
if (ret)
{
row.BuyerRefundStatusText = "退款成功";
ToastHelper.Show("操作成功");
}
else
throw new Exception("状态更改失败");
}
catch (Exception ex)
{
ToastHelper.Show("操作失败 " + ex.Message, type: ToastType.Error);
}
finally
{
}
}
public ICommand UpdateRemarkCommand => new AsyncDelegateCommand<ShopOrderDetailRow>(UpdateRemark);
private async Task UpdateRemark(ShopOrderDetailRow row)
{
string? remark = InputDialog.ShowText("请输入备注:", "备注", row.Remark, allowEmpty: true);
if (remark == null)
return;
try
{
var ret = await _statisticsService.UpdateBuyerAfterOrderRemark(row.BuyerRefundId, remark);
if (ret)
{
row.Remark = remark;
ToastHelper.Show("操作成功");
}
else
throw new Exception("备注更改失败");
}
catch (Exception ex)
{
ToastHelper.Show("操作失败 " + ex.Message, type: ToastType.Error);
}
finally
{
}
}
/// <summary>把行拼成制表符分隔的文本(第一行是表头)</summary>
private string BuildCopyText(IEnumerable<ShopOrderDetailRow> rows)
{
var sb = new StringBuilder();
bool includeRemark = _detailType == ShopOrderDetailType.BuyerUnrefunded;
// 表头
List<string> headers = ["店名", "订单", "创建时间", "金额", "退款金额", "平台费用", "利润", "买手单号", "外采金额", "买手退款", "退款状态"];
if (includeRemark)
headers.Add("备注");
sb.AppendLine(string.Join("\t", headers));
// 数据行
foreach (var item in rows)
{
var cols = new List<string>
{
CsvEscape(item.ShopName),
item.OrderId,
item.CreateTime.ToString("yyyy-MM-dd HH:mm"),
(item.OrderPrice / 100m).ToString("0.00"),
(item.OrderRefundAmount / 100m).ToString("0.00"),
(item.PlatformFee / 100m).ToString("0.00"),
(item.ProfitAmount / 100m).ToString("0.00"),
CsvEscape(item.OutOrderSn),
(item.BuyerOutAmount / 100m).ToString("0.00"),
(item.BuyerRefundAmount / 100m).ToString("0.00"),
CsvEscape(item.BuyerRefundStatusText)
};
if (includeRemark)
cols.Add(CsvEscape(item.Remark));
sb.AppendLine(string.Join("\t", cols));
}
return sb.ToString();
}
private string CsvEscape(string value)
{
if (string.IsNullOrEmpty(value))
return "";
// 含逗号、引号、换行时,用双引号包起来,内部引号翻倍
if (value.Contains(',') || value.Contains('"') || value.Contains('\n') || value.Contains('\r'))
{
return "\"" + value.Replace("\"", "\"\"") + "\"";
}
return value;
}
}
@@ -1,5 +1,4 @@
using _29WxOrderWpf.Commands;
using _29WxOrderWpf.Common;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Ctrls.Statistics.Models;
using _29WxOrderWpf.Ctrls.Statistics.Services;
using AllBase.Model.MvvmBaseClasses;
@@ -10,6 +9,7 @@ using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using WxOrder.Framework.Commons;
namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
{
@@ -39,6 +39,12 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
private int _totalCount;
private string _pagerText = string.Empty;
/// <summary>是否已完成首次初始化(用于避免页签来回切换时重复初始化、重复查询)</summary>
private bool _initialized;
/// <summary>上一次真正生效(并据此计算过日期)的时间范围选项,避免同一个选项被重复应用</summary>
private TimeRangeOption _appliedTimeRange;
public PeriodRevenueStatisticsViewModel(PeriodStatisticType periodType)
: this(periodType, new ShopRevenueStatisticsService())
{
@@ -65,8 +71,18 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
}
/// <summary>
/// 页面首次显示时初始化查询条件并加载数据(由外层 TabControl 的选中事件调用)。
/// 重复调用(在“综合统计 / 天统计 / 周统计 / 月统计”页签之间来回切换)会被忽略:
/// 否则每次切回来都会把时间范围和店铺重置成默认值,并重新发起一次查询。
/// 需要刷新数据时点“查询”按钮即可。
/// </summary>
public void Init()
{
if (_initialized)
return;
_initialized = true;
InitializeAsync();
}
@@ -172,7 +188,16 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
set
{
this.SetValue(x => x.SelectedTimeRange, value);
ApplyTimeRange();
// 只有用户真正切换到“另一个”时间范围选项时才重新计算起止日期。
// 页签切换时下拉框会把同一个选项(甚至先 null 再回写)重放一遍,
// 若照样重算,就会把用户手工调过的日期覆盖掉(例如自定义区间被改回“本周”)。
if (value != null && !ReferenceEquals(_appliedTimeRange, value))
{
_appliedTimeRange = value;
ApplyTimeRange();
}
OnPropertyChanged(nameof(IsCustomDateRange));
}
}
@@ -481,25 +506,28 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
}
}
/// <summary>根据选中店铺生成查询店铺 key 列表:未选/全选/选中“全部店铺”时返回空列表(表示全部店铺)</summary>
private List<string> BuildSelectedShopKeys()
/// <summary>
/// 根据选中店铺生成查询用 ERP 店铺ID 列表(接口 ShopIds 使用 ShopLoginInfo.ErpShopId):
/// 未选/全选/选中“全部店铺”时返回空列表(表示全部店铺)。
/// </summary>
private List<string> BuildSelectedShopIds()
{
var selected = SelectedShops;
if (selected == null || selected.Count == 0)
return new List<string>();
var keys = selected.Select(s => s == null ? string.Empty : s.AppKey).ToList();
if (keys.Any(string.IsNullOrEmpty))
var ids = selected.Select(s => s == null ? string.Empty : s.ErpShopId).ToList();
if (ids.Any(string.IsNullOrEmpty))
return new List<string>();
if (selected.Count >= ShopOptions.Count)
return new List<string>();
return keys;
return ids;
}
/// <summary>执行查询,刷新周期统计表格并回到第一页</summary>
private async Task LoadAsync()
/// <summary>组装查询参数(起止日期已保证先后顺序)</summary>
private ShopRevenueStatisticsQuery BuildQuery()
{
if (StartDate > EndDate)
{
@@ -508,19 +536,23 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
EndDate = temp;
}
return new ShopRevenueStatisticsQuery
{
StartDate = StartDate,
EndDate = EndDate,
ShopIds = BuildSelectedShopIds(),
};
}
/// <summary>执行查询,刷新周期统计表格并回到第一页</summary>
private async Task LoadAsync()
{
IsLoading = true;
try
{
var query = new ShopRevenueStatisticsQuery
{
StartDate = StartDate,
EndDate = EndDate,
ShopKeys = BuildSelectedShopKeys(),
};
var table = await _service.GetPeriodStatisticsAsync(query, _periodType);
Summary = await _service.GetSummaryAsync(query);
_allItems = table ?? new List<ShopPeriodStatisticsItem>();
var result = await _service.QueryPeriodStatisticsAsync(BuildQuery(), _periodType);
Summary = result.Summary;
_allItems = result.Items ?? new List<ShopPeriodStatisticsItem>();
TotalCount = _allItems.Count;
TotalPages = TotalCount == 0 ? 1 : (int)Math.Ceiling(TotalCount / (double)PageSize);
GoToPage(1);
@@ -553,35 +585,51 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
private async Task ShowOrderList(string type)
{
var query = new ShopRevenueStatisticsQuery
var detailType = ParseDetailType(type);
List<ShopOrderDetailResponse> showList;
// 明细接口数据量大、耗时长,期间显示页面统一的加载遮罩,避免点了没反应
IsLoading = true;
try
{
StartDate = StartDate,
EndDate = EndDate,
ShopKeys = BuildSelectedShopKeys(),
};
var rows = await _service.QueryRowsAsync(query);
List<ShopRevenueStatisticsRow> showList = new List<ShopRevenueStatisticsRow>();
switch (type)
showList = await _service.QueryOrderRowsAsync(BuildQuery(), detailType)
?? new List<ShopOrderDetailResponse>();
}
catch (Exception ex)
{
case "ValidOrderCount":
showList = RevenueStatisticsAggregator.GetValidOrder(rows);
break; //有效订单
case "RefundOrderCount":
showList = RevenueStatisticsAggregator.GetRefundOrder(rows);
break;//退款订单
case "BuyerRefundRemainingAmount":
showList = RevenueStatisticsAggregator.GetBuyerRefundRemainingOrder(rows);
break;//待退回采购金额
default:
break;
MessageBox.Show("订单明细查询失败:" + ex.Message, "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
finally
{
IsLoading = false;
}
if (showList.Count == 0)
{
MessageBox.Show("未查询到符合条件的订单明细。", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
new DialogWindow()
{
Title = "订单列表",
Content = new ShowOrderDialogView(showList),
DataContext = rows
Content = new ShowOrderDialogView(showList, detailType, _service),
DataContext = showList
}.ShowDialog();
}
/// <summary>卡片“明细”按钮参数 → 订单明细类型(对应接口参数 OrderType)</summary>
private static ShopOrderDetailType ParseDetailType(string type)
{
switch (type)
{
case "RefundOrderCount":
return ShopOrderDetailType.Refund; //退款订单
case "BuyerRefundRemainingAmount":
return ShopOrderDetailType.BuyerUnrefunded; //买手未退回金额的订单
default:
return ShopOrderDetailType.Valid; //有效订单
}
}
}
}
@@ -1,5 +1,5 @@
using _29WxOrderWpf.Commands;
using _29WxOrderWpf.Common;
using WxOrder.Framework.Commons;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Ctrls.Statistics.Models;
using _29WxOrderWpf.Ctrls.Statistics.Services;
using AllBase.Model.MvvmBaseClasses;
@@ -10,7 +10,9 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using Work.BaseForms;
namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
{
@@ -30,6 +32,9 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
private ObservableCollection<ShopOption> _selectedShops;
private string _selectedPlatform;
/// <summary>上一次真正生效(并据此计算过日期)的时间范围选项,避免同一个选项被重复应用</summary>
private TimeRangeOption _appliedTimeRange;
public ShopRevenueStatisticsViewModel()
: this(new ShopRevenueStatisticsService())
{
@@ -69,7 +74,16 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
set
{
this.SetValue(x => x.SelectedTimeRange, value);
ApplyTimeRange();
// 只有用户真正切换到“另一个”时间范围选项时才重新计算起止日期。
// 页签切换时下拉框会把同一个选项(甚至先 null 再回写)重放一遍,
// 若照样重算,就会把用户手工调过的日期覆盖掉。
if (value != null && !ReferenceEquals(_appliedTimeRange, value))
{
_appliedTimeRange = value;
ApplyTimeRange();
}
OnPropertyChanged(nameof(IsCustomDateRange));
}
}
@@ -234,57 +248,66 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
}
}
/// <summary>根据选中店铺生成查询店铺 key 列表:未选/全选/选中“全部店铺”时返回空列表(表示全部店铺)</summary>
private List<string> BuildSelectedShopKeys()
/// <summary>
/// 根据选中店铺生成查询用 ERP 店铺ID 列表(接口 ShopIds 使用 ShopLoginInfo.ErpShopId):
/// 未选/全选/选中“全部店铺”时返回空列表(表示全部店铺)。
/// </summary>
private List<string> BuildSelectedShopIds()
{
var selected = SelectedShops;
if (selected == null || selected.Count == 0)
return new List<string>();
var keys = selected.Select(s => s == null ? string.Empty : s.AppKey).ToList();
if (keys.Any(string.IsNullOrEmpty))
var ids = selected.Select(s => s == null ? string.Empty : s.ErpShopId).ToList();
if (ids.Any(string.IsNullOrEmpty))
return new List<string>();
if (selected.Count >= ShopOptions.Count)
return new List<string>();
return keys;
return ids;
}
/// <summary>执行查询,刷新页面所有统计数据</summary>
private async Task LoadAsync()
/// <summary>组装查询参数(起止日期已保证先后顺序)</summary>
private ShopRevenueStatisticsQuery BuildQuery()
{
if (StartDate > EndDate)
if (StartDate == EndDate)
{
EndDate = EndDate.AddDays(1).AddSeconds(-1);
}
else if (StartDate > EndDate)
{
var temp = StartDate;
StartDate = EndDate;
EndDate = temp;
}
return new ShopRevenueStatisticsQuery
{
StartDate = StartDate,
EndDate = EndDate,
ShopIds = BuildSelectedShopIds(),
};
}
/// <summary>执行查询,刷新页面所有统计数据</summary>
private async Task LoadAsync()
{
IsLoading = true;
try
{
var query = new ShopRevenueStatisticsQuery
{
StartDate = StartDate,
EndDate = EndDate,
ShopKeys = BuildSelectedShopKeys(),
};
var result = await _service.QueryAsync(BuildQuery());
Summary = await _service.GetSummaryAsync(query);
var trend = await _service.GetSalesTrendAsync(query);
TrendData = new ObservableCollection<RevenueTrendPoint>(trend);
var proportion = await _service.GetShopSalesProportionAsync(query);
ShopProportionData = new ObservableCollection<ShopSalesProportionItem>(proportion);
var table = await _service.GetShopStatisticsAsync(query);
ShopStatistics = new ObservableCollection<ShopStatisticsItem>(table);
Summary = result.Summary;
TrendData = new ObservableCollection<RevenueTrendPoint>(result.Trend ?? new List<RevenueTrendPoint>());
ShopProportionData = new ObservableCollection<ShopSalesProportionItem>(result.ShopProportions ?? new List<ShopSalesProportionItem>());
ShopStatistics = new ObservableCollection<ShopStatisticsItem>(result.ShopStatistics ?? new List<ShopStatisticsItem>());
}
catch (Exception)
catch (Exception ex)
{
// 查询异常:保留上一次数据,可在此接入日志/错误提示
// 查询异常:保留上一次数据,并弹框提示
BaseMsgForm.ShowError("查询失败:" + ex.Message, "提示");
}
finally
{
@@ -308,35 +331,54 @@ namespace _29WxOrderWpf.Ctrls.Statistics.ViewModels
private async Task ShowOrderList(string type)
{
var query = new ShopRevenueStatisticsQuery
var detailType = ParseDetailType(type);
List<ShopOrderDetailResponse> showList;
IsLoading = true;
try
{
StartDate = StartDate,
EndDate = EndDate,
ShopKeys = BuildSelectedShopKeys(),
};
var rows = await _service.QueryRowsAsync(query);
List<ShopRevenueStatisticsRow> showList = new List<ShopRevenueStatisticsRow>();
switch (type)
showList = await _service.QueryOrderRowsAsync(BuildQuery(), detailType)
?? new List<ShopOrderDetailResponse>();
}
catch (Exception ex)
{
case "ValidOrderCount":
showList = RevenueStatisticsAggregator.GetValidOrder(rows);
break; //有效订单
case "RefundOrderCount":
showList = RevenueStatisticsAggregator.GetRefundOrder(rows);
break;//退款订单
case "BuyerRefundRemainingAmount":
showList = RevenueStatisticsAggregator.GetBuyerRefundRemainingOrder(rows);
break;//待退回采购金额
default:
break;
BaseMsgForm.ShowError("订单明细查询失败:" + ex.Message, "提示");
return;
}
finally
{
IsLoading = false;
}
new DialogWindow()
if (showList.Count == 0)
{
Title="订单列表",
Content = new ShowOrderDialogView(showList),
DataContext = rows
}.ShowDialog();
BaseMsgForm.ShowInfo("未查询到符合条件的订单明细。", "提示");
return;
}
new DialogWindow(GetWindow())
{
Title = "订单列表",
Content = new ShowOrderDialogView(showList, detailType, _service),
DataContext = showList
}.Show();
}
/// <summary>卡片“明细”按钮参数 → 订单明细类型(对应接口参数 OrderType)</summary>
private static ShopOrderDetailType ParseDetailType(string type)
{
switch (type)
{
case "RefundOrderCount":
return ShopOrderDetailType.Refund; //退款订单
case "BuyerRefundRemainingAmount":
return ShopOrderDetailType.BuyerUnrefunded; //买手未退回金额的订单
case "ProfitOrder":
return ShopOrderDetailType.Profit; //买手未退回金额的订单
default:
return ShopOrderDetailType.Valid; //有效订单
}
}
public Func<Window> GetWindow;
}
}
+270 -68
View File
@@ -1,72 +1,274 @@
<basewindows:BaseWindow xmlns:basewindows="clr-namespace:_29WxOrderWpf.BaseWindows" x:Class="_29WxOrderWpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:_29WxOrderWpf"
xmlns:orderctrls="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
xmlns:shopctrls="clr-namespace:_29WxOrderWpf.Ctrls.ShopCtrls"
xmlns:userctrls="clr-namespace:_29WxOrderWpf.UserControls" xmlns:buyerctrls="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
mc:Ignorable="d" Style="{StaticResource BaseNoneBorderWindowStyle}"
x:Name="mainWindow" Title="MainWindow" Height="900" Width="1600" Loaded="Window_Loaded" Closing="BaseWindow_Closing">
<basewindows:BaseWindow
x:Class="_29WxOrderWpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:basewindows="clr-namespace:_29WxOrderWpf.BaseWindows"
xmlns:buyerctrls="clr-namespace:_29WxOrderWpf.Ctrls.BuyerCtrls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:orderctrls="clr-namespace:_29WxOrderWpf.Ctrls.OrderCtrls"
xmlns:shopctrls="clr-namespace:_29WxOrderWpf.Ctrls.ShopCtrls"
xmlns:userctrls="clr-namespace:_29WxOrderWpf.UserControls"
x:Name="mainWindow"
Title="MainWindow"
Width="1600"
Height="900"
Closing="BaseWindow_Closing"
Loaded="Window_Loaded"
Style="{StaticResource BaseNoneBorderWindowStyle}"
mc:Ignorable="d">
<Grid Background="Transparent" x:Name="mainGrid" Margin="{Binding ElementName=mainWindow, Path=Padding}">
<Grid.RowDefinitions>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid x:Name="gridTitle">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="{StaticResource main29WeixinIcon}" Height="50" Width="50" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="4"></Image>
<Label x:Name="lblAppName" FontSize="20" Margin="0,0,0,0" Foreground="{StaticResource mainColorLightBrush}" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalContentAlignment="Center" Content="拍单软件" Grid.Column="1"></Label>
<Grid
x:Name="mainGrid"
Margin="{Binding ElementName=mainWindow, Path=Padding}"
Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="60" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid
x:Name="gridTitle"
Background="Transparent"
MouseLeftButtonDown="gridTitle_MouseLeftButtonDown">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Image
Width="50"
Height="50"
Margin="4"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Source="{StaticResource main29WeixinIcon}" />
<Label
x:Name="lblAppName"
Grid.Column="1"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Content="拍单软件"
FontSize="20"
Foreground="{StaticResource mainColorLightBrush}" />
<WrapPanel Margin="0,4,80,0" Grid.Column="12" HorizontalAlignment="Right" VerticalAlignment="Top">
<Label x:Name="lblDebug" FontSize="12" Margin="2,4,0,0" Foreground="{StaticResource mainColorLightBrush}" HorizontalAlignment="Right"
VerticalAlignment="Top" VerticalContentAlignment="Center" Content="[release]" Opacity="0.7" Grid.Column="4"></Label>
<Label x:Name="lblVersion" FontSize="12" Margin="2,4,0,0" Foreground="{StaticResource mainColorLightBrush}" HorizontalAlignment="Right"
VerticalAlignment="Top" VerticalContentAlignment="Center" Content="版本信息" Opacity="0.7" Grid.Column="4"></Label>
</WrapPanel>
<Label x:Name="lblBalance" FontSize="12" Margin="0,25,80,0" HorizontalAlignment="Right" Foreground="#60ff66" MouseLeftButtonUp="lblBalance_MouseLeftButtonUp"
VerticalAlignment="Top" VerticalContentAlignment="Center" Content="{Binding Balance}" Opacity="0.7" Grid.Column="4" Cursor="Hand"></Label>
</Grid>
<Grid x:Name="gridContainer" Grid.Row="1" Background="White" Margin="2,0,2,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<orderctrls:OrderListCtrl x:Name="orderListCtrl" Grid.Column="1" Visibility="Collapsed"></orderctrls:OrderListCtrl>
<Grid x:Name="gridPddBuyerOrderReadCtrl" Visibility="Hidden" Grid.ColumnSpan="2" Background="#7F000000" MouseLeftButtonUp="gridPddBuyerOrderReadCtrl_MouseLeftButtonUp">
<Border CornerRadius="10" HorizontalAlignment="Right" Height="auto" Background="White" Margin="0,50,0,0">
<buyerctrls:PDDBuyerOrderReadCtrl x:Name="pddBuyerOrderReadCtrl" Grid.Column="1" Visibility="Collapsed" Panel.ZIndex="-1" Width="1200"
HorizontalAlignment="Right"/>
</Border>
</Grid>
<buyerctrls:PDDBuyerSelectCtrl x:Name="pddBuyerSelectCtrl" Visibility="Collapsed" Width="280" Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Right" Margin="8"/>
<Grid x:Name="gridUser" Visibility="Hidden" Grid.ColumnSpan="2" Background="#7F000000">
<Border CornerRadius="4" Width="500" Height="600" Background="White">
<shopctrls:ShopListCtrl x:Name="shopListCtrl" Visibility="{Binding ElementName=gridUser,Mode=TwoWay,Path=Visibility}" Margin="2"
Grid.ColumnSpan="2"></shopctrls:ShopListCtrl>
</Border>
</Grid>
</Grid>
<userctrls:UcWindowBoxes x:Name="ucWindowBox" VerticalAlignment="Top" HorizontalAlignment="Right" Margin="4" MaxBoxVisibility="Visible"/>
<WrapPanel
Grid.Column="2"
HorizontalAlignment="Right"
VerticalAlignment="Center">
<Button
x:Name="btOrderSupport"
Click="bt_showOrderSupport"
IsEnabled="False"
Style="{StaticResource IconButtonStyle}"
ToolTip="客户工单">
<Grid Width="30" Height="30">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="22"
Foreground="{StaticResource mainColorLightBrush}"
Style="{StaticResource TextBlockIcon}"
Text="{StaticResource txt-alert}" />
<Border
x:Name="borderOrderSupportUnread"
Height="16"
MinWidth="16"
Padding="4,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
d:Visibility="Visible"
Background="#E53935"
CornerRadius="8"
Visibility="Collapsed">
<TextBlock
x:Name="tbOrderSupportUnread"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="10"
FontWeight="Bold"
Foreground="White"
Text="0" />
</Border>
</Grid>
</Button>
<Border
Width="1"
Height="20"
Margin="10,0"
Background="#b893b2" />
<Button Click="bt_setting" Style="{StaticResource IconButtonStyle}">
<TextBlock
FontSize="22"
Foreground="{StaticResource mainColorLightBrush}"
Style="{StaticResource TextBlockIcon}"
Text="{StaticResource txt-settings}" />
</Button>
<Border
Width="1"
Height="20"
Margin="10,0"
Background="#b893b2" />
</WrapPanel>
<WrapPanel
Grid.Column="3"
HorizontalAlignment="Right"
VerticalAlignment="Top">
<Border x:Name="borderMessage" Grid.Row="1" Width="auto" Height="auto" HorizontalAlignment="Center" Margin="10,50" VerticalAlignment="Top" BorderThickness="1" Opacity="0"
BorderBrush="{StaticResource pageColorBrush}" CornerRadius="6" Background="White" IsHitTestVisible="False"
MinWidth="120" MinHeight="2" MaxWidth="1200" Panel.ZIndex="1000000">
<Border.Effect>
<DropShadowEffect ShadowDepth="5" Color="#FF98638f" BlurRadius="40" Opacity="0.2"/>
</Border.Effect>
<TextBlock Text="这里是默认提示信息" Margin="10" VerticalAlignment="Center" HorizontalAlignment="Center" x:Name="tbMessage" TextWrapping="Wrap"></TextBlock>
</Border>
<!--<Image x:Name="imageBig" HorizontalAlignment="Left" Height="800" Width="800" VerticalAlignment="Center" Grid.Row="1" Margin="200,0,0,0"/>-->
</Grid>
<UniformGrid Rows="2">
<WrapPanel>
<Label
x:Name="lblDebug"
Margin="2,4,0,0"
Content="[release]"
FontSize="12"
Foreground="{StaticResource mainColorLightBrush}"
Opacity="0.7" />
<Label
x:Name="lblVersion"
Margin="2,4,0,0"
Content="版本信息"
FontSize="12"
Foreground="{StaticResource mainColorLightBrush}"
Opacity="0.7" />
</WrapPanel>
<Label
x:Name="lblBalance"
Grid.Column="4"
HorizontalAlignment="Right"
VerticalAlignment="Top"
VerticalContentAlignment="Center"
d:Content="快递余额:999.99"
Content="{Binding Balance}"
Cursor="Hand"
FontSize="12"
Foreground="#60ff66"
MouseLeftButtonUp="lblBalance_MouseLeftButtonUp"
Opacity="0.7" />
</UniformGrid>
</WrapPanel>
<userctrls:UcWindowBoxes
x:Name="ucWindowBox"
Grid.Column="4"
Margin="4"
HorizontalAlignment="Right"
VerticalAlignment="Top"
MaxBoxVisibility="Visible" />
</Grid>
<Grid
x:Name="gridContainer"
Grid.Row="1"
Margin="2,0,2,2"
Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<orderctrls:OrderListCtrl
x:Name="orderListCtrl"
Grid.Column="1"
d:Visibility="Visible"
Visibility="Collapsed" />
<Grid
x:Name="gridTbBuyerOrderReadCtrl"
Grid.ColumnSpan="2"
d:Visibility="Visible"
Background="#7F000000"
MouseLeftButtonUp="gridPddBuyerOrderReadCtrl_MouseLeftButtonUp"
Visibility="Hidden">
<Border
Height="auto"
Margin="0,50,0,0"
HorizontalAlignment="Right"
Background="White"
CornerRadius="10">
<Grid>
<buyerctrls:PDDBuyerOrderReadCtrl
x:Name="pddBuyerOrderReadCtrl"
Grid.Column="1"
Width="1200"
HorizontalAlignment="Right"
Panel.ZIndex="-1"
d:Visibility="Visible"
Visibility="Collapsed" />
<buyerctrls:TbBuyerOrderReadCtrl
x:Name="tbBuyerOrderReadCtrl"
Grid.Column="1"
Width="1200"
HorizontalAlignment="Right"
Panel.ZIndex="-1"
d:Visibility="Collapsed"
Visibility="Collapsed" />
</Grid>
</Border>
</Grid>
<buyerctrls:PDDBuyerSelectCtrl
x:Name="pddBuyerSelectCtrl"
Grid.Column="1"
Margin="8"
HorizontalAlignment="Right"
VerticalAlignment="Top"
d:Visibility="Visible"
Visibility="Collapsed" />
<Grid
x:Name="gridUser"
Grid.ColumnSpan="2"
Background="#7F000000"
Visibility="Hidden">
<Border
Width="850"
Height="650"
Background="White"
CornerRadius="4">
<shopctrls:ShopListCtrl
x:Name="shopListCtrl"
Grid.ColumnSpan="2"
Margin="2"
Visibility="{Binding ElementName=gridUser, Mode=TwoWay, Path=Visibility}" />
</Border>
</Grid>
</Grid>
<Border
x:Name="borderMessage"
Grid.Row="1"
Width="auto"
Height="auto"
MinWidth="120"
MinHeight="2"
MaxWidth="1200"
Margin="10,50"
HorizontalAlignment="Center"
VerticalAlignment="Top"
Panel.ZIndex="1000000"
Background="White"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="1"
CornerRadius="6"
IsHitTestVisible="False"
Opacity="0">
<Border.Effect>
<DropShadowEffect
BlurRadius="40"
Opacity="0.2"
ShadowDepth="5"
Color="#FF98638f" />
</Border.Effect>
<TextBlock
x:Name="tbMessage"
Margin="10"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="这里是默认提示信息"
TextWrapping="Wrap" />
</Border>
<!--<Image x:Name="imageBig" HorizontalAlignment="Left" Height="800" Width="800" VerticalAlignment="Center" Grid.Row="1" Margin="200,0,0,0"/>-->
</Grid>
</basewindows:BaseWindow>
File diff suppressed because it is too large. Load diff
+7 -2
View File
@@ -20,7 +20,7 @@ namespace _29WxOrderWpf.Services;
/// 礼物单服务
///
/// </summary>
public class ShipGiftService: SingleInstance<ShipGiftService>
public class ShipGiftService : SingleInstance<ShipGiftService>
{
public enum GiftType
{
@@ -42,6 +42,11 @@ public class ShipGiftService: SingleInstance<ShipGiftService>
{
giftAmount = 1.55m;
}
if (BaseClass.Setting.AutoSwitchGiftType && (item.product_price ?? 0) > 6 * 100)
{
giftAmount = 1.6m;
}
decimal amount = giftAmount + BaseClass.OemGiftAmount;
@@ -78,6 +83,6 @@ public class ShipGiftService: SingleInstance<ShipGiftService>
var ret = await _api.SendShipGift([orderId], (int)giftType, amount, BaseClass.OemGiftAmount);
return ret;
}
}
+20 -2
View File
@@ -1,10 +1,12 @@
using AllBase;
using _29WxOrderWpf.ViewModels;
using AllBase;
using AllBase.DouYinModel.Param.ConfigManage;
using AllBase.Helper;
using AllBase.Model.Config;
using AllBase.Model.DBModel;
using NaiBa.Util;
using NaiBa.Util.Helper;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -21,11 +23,23 @@ namespace _29WxOrderWpf
GlobalConfig.BuyConfig = ConfigHelper.LoadConfig<BuyConfig>("buy_config_260708");
if (GlobalConfig.BuyConfig == null)
GlobalConfig.BuyConfig = new BuyConfig();
GlobalConfig.BuyConfig.IsSyncDirectBuyOrderWaybill = false;
GlobalConfig.lstWXShopTokenInfo = ConfigHelper.LoadConfig<ConcurrentList<WXShopTokenInfo>>("wx_shop_token_list");
if (GlobalConfig.lstWXShopTokenInfo == null)
GlobalConfig.lstWXShopTokenInfo = new ConcurrentList<WXShopTokenInfo>();
// 自动拍单支付宝密码
var alipayPassword = ConfigHelper.LoadConfig<List<string>>("ali_pay_password")?.FirstOrDefault() ?? "";
GlobalConfig.AutoBuyConfig = ConfigHelper.LoadConfig<AutoBuyConfig>("auto_buy_config");
if (GlobalConfig.AutoBuyConfig == null)
GlobalConfig.AutoBuyConfig = new AutoBuyConfig() { AlipayPassword = alipayPassword, IsLimitMinProfit = false, MinProfit = 0 };
BaseClass.Setting = NaiBa.Util.Helper.ConfigHelper.LoadConfig<SettingConfig>(SettingViewModel.SettingFileName);
if (BaseClass.Setting == null) BaseClass.Setting = new SettingConfig();
BaseClass.Setting.AutoSwitchGiftType = true;
new WxOrder.Framework.Startup();
}
@@ -47,7 +61,11 @@ namespace _29WxOrderWpf
{
BaseClass.Balance = BaseRegex.GetDecimalJson(ref html, "balance");
MainWindow.Instance.Balance = BaseClass.Balance.ToString("0.00");
}
// 更新下每单扣费金额
BaseClass.PostagePerOrder = Math.Max(2.2m, BaseRegex.GetDecimalJson(ref html, "postage_per_order"));
BaseClass.RefundPostagePerOrder = Math.Max(2.5m, BaseRegex.GetDecimalJson(ref html, "refund_postage_per_order"));
}
}
}
}
@@ -1,41 +1,41 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="mainColorBrush" Color="#FF98638f" />
<SolidColorBrush x:Key="mainColorLightBrush" Color="#f5ebff" />
<SolidColorBrush x:Key="mainColorDarkBrush" Color="#FF6b5393" />
<SolidColorBrush x:Key="mainForegroundColorBrush" Color="#FF666666" />
<LinearGradientBrush x:Key="mainLinearColorBrush" StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0.0" Color="#FF98638f" />
<GradientStop Offset="1.0" Color="#FF6b5393" />
</LinearGradientBrush>
<SolidColorBrush x:Key="pageColorBrush" Color="#FF98638f" />
<SolidColorBrush x:Key="pageColorLightBrush" Color="#f5ebff" />
<SolidColorBrush x:Key="pageColorDarkBrush" Color="#FF6b5393" />
<SolidColorBrush x:Key="mainColorBrush" Color="#FF98638f" />
<SolidColorBrush x:Key="mainColorLightBrush" Color="#f5ebff" />
<SolidColorBrush x:Key="mainColorDarkBrush" Color="#FF6b5393" />
<SolidColorBrush x:Key="mainForegroundColorBrush" Color="#FF666666" />
<LinearGradientBrush x:Key="mainLinearColorBrush" StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0.0" Color="#FF98638f" />
<GradientStop Offset="1.0" Color="#FF6b5393" />
</LinearGradientBrush>
<SolidColorBrush x:Key="pageColorBrush" Color="#FF98638f" />
<SolidColorBrush x:Key="pageColorLightBrush" Color="#f5ebff" />
<SolidColorBrush x:Key="pageColorDarkBrush" Color="#FF6b5393" />
<SolidColorBrush x:Key="ListCtrlBackColorBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="ListHeadBackColorBrush" Color="#FFf8f8f9" />
<SolidColorBrush x:Key="ListHeadBorderColorBrush" Color="#FFe9e9ea" />
<SolidColorBrush x:Key="ListBackColorBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="ListRowTitleBackColorBrush" Color="#FFf5f7fa" />
<SolidColorBrush x:Key="ListRowBorderColorBrush" Color="#FFf8f8f9" />
<SolidColorBrush x:Key="ListRowHoverBackColorBrush" Color="#FFf5f7fa" />
<SolidColorBrush x:Key="ListCtrlBackColorBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="ListHeadBackColorBrush" Color="#FFf8f8f9" />
<SolidColorBrush x:Key="ListHeadBorderColorBrush" Color="#FFe9e9ea" />
<SolidColorBrush x:Key="ListBackColorBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="ListRowTitleBackColorBrush" Color="#FFf5f7fa" />
<SolidColorBrush x:Key="ListRowBorderColorBrush" Color="#FFf8f8f9" />
<SolidColorBrush x:Key="ListRowHoverBackColorBrush" Color="#FFf5f7fa" />
<SolidColorBrush x:Key="HorizontalGridLinesBrush" Color="#FFf5f7fa" />
<SolidColorBrush x:Key="VerticalGridLinesBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="HorizontalGridLinesBrush" Color="#FFf5f7fa" />
<SolidColorBrush x:Key="VerticalGridLinesBrush" Color="#FFFFFFFF" />
<SolidColorBrush x:Key="PageOkBrush" Color="#FF67c23a" />
<SolidColorBrush x:Key="PageOkBrush50" Color="#5067c23a" />
<SolidColorBrush x:Key="PageWarningBrush" Color="#FFfa4733" />
<SolidColorBrush x:Key="PageWarningBrushCC" Color="#CCfa4733" />
<SolidColorBrush x:Key="PageWarningBrush80" Color="#80fa4733" />
<SolidColorBrush x:Key="PageWarningBrush50" Color="#50fa4733" />
<SolidColorBrush x:Key="PageWarningBrush20" Color="#20fa4733" />
<SolidColorBrush x:Key="PageLinkBrush" Color="#409eff" />
<SolidColorBrush x:Key="PageOkBrush" Color="#FF67c23a" />
<SolidColorBrush x:Key="PageOkBrush50" Color="#5067c23a" />
<SolidColorBrush x:Key="PageWarningBrush" Color="#FFfa4733" />
<SolidColorBrush x:Key="PageWarningBrushCC" Color="#CCfa4733" />
<SolidColorBrush x:Key="PageWarningBrush80" Color="#80fa4733" />
<SolidColorBrush x:Key="PageWarningBrush50" Color="#50fa4733" />
<SolidColorBrush x:Key="PageWarningBrush20" Color="#20fa4733" />
<SolidColorBrush x:Key="PageLinkBrush" Color="#409eff" />
<SolidColorBrush x:Key="FlagGrayBrush" Color="#ffaaaaaa" />
<SolidColorBrush x:Key="FlagRedBrush" Color="#FFfa4733" />
<SolidColorBrush x:Key="FlagOrangeBrush" Color="#FFfab533" />
<SolidColorBrush x:Key="FlagGreenBrush" Color="#FF67c23a" />
<SolidColorBrush x:Key="FlagBlueBrush" Color="#409eff" />
<SolidColorBrush x:Key="FlagPurpleBrush" Color="#FFc883bf" />
<SolidColorBrush x:Key="FlagGrayBrush" Color="#ffaaaaaa" />
<SolidColorBrush x:Key="FlagRedBrush" Color="#FFfa4733" />
<SolidColorBrush x:Key="FlagOrangeBrush" Color="#FFfab533" />
<SolidColorBrush x:Key="FlagGreenBrush" Color="#FF67c23a" />
<SolidColorBrush x:Key="FlagBlueBrush" Color="#409eff" />
<SolidColorBrush x:Key="FlagPurpleBrush" Color="#FFc883bf" />
</ResourceDictionary>
+197
View File
@@ -0,0 +1,197 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- ========== 侧边 TabControl ========== -->
<Style x:Key="SideTabControl" TargetType="TabControl">
<Setter Property="Background" Value="White" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabControl">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- 左侧导航 -->
<Border
Grid.Column="0"
Background="#F7F8FA"
BorderBrush="#E8EAED"
BorderThickness="0,0,1,0">
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="0,12">
<TextBlock
Margin="20,8,0,16"
FontSize="20"
FontWeight="Bold"
Foreground="{StaticResource mainColorBrush}"
Text="设置" />
<TabPanel IsItemsHost="True" />
</StackPanel>
</ScrollViewer>
</Border>
<!-- 右侧内容 -->
<ScrollViewer
Grid.Column="1"
Padding="0"
VerticalScrollBarVisibility="Auto">
<ContentPresenter ContentSource="SelectedContent" />
</ScrollViewer>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ========== 侧边 TabItem ========== -->
<Style x:Key="SideTabItem" TargetType="TabItem">
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TabItem">
<Border
x:Name="Bd"
Margin="0,2"
Padding="12,10"
Background="Transparent">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
x:Name="Icon"
Grid.Column="0"
Margin="0,0,12,0"
VerticalAlignment="Center"
FontSize="22"
Foreground="{StaticResource mainColorBrush}"
Style="{StaticResource TextBlockIcon}"
Text="{TemplateBinding Tag}" />
<!-- 只给 Header 文字设字号/颜色 -->
<ContentPresenter
x:Name="HeaderHost"
Grid.Column="1"
VerticalAlignment="Center"
ContentSource="Header"
TextElement.FontSize="14"
TextElement.FontWeight="Normal"
TextElement.Foreground="{StaticResource mainColorBrush}" />
<!-- 选中时的右侧小圆点 -->
<Ellipse
x:Name="Dot"
Grid.Column="2"
Width="6"
Height="6"
VerticalAlignment="Center"
Fill="#0078D4"
Visibility="Collapsed" />
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#ECEEF2" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#E6F0FB" />
<Setter TargetName="Dot" Property="Visibility" Value="Visible" />
<Setter TargetName="HeaderHost" Property="TextElement.Foreground" Value="{StaticResource mainColorBrush}" />
<Setter TargetName="HeaderHost" Property="TextElement.FontWeight" Value="SemiBold" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ========== 设置卡片 ========== -->
<Style x:Key="SettingsCard" TargetType="Border">
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="#E8EAED" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Padding" Value="0" />
<Setter Property="Margin" Value="0,0,0,16" />
</Style>
<!-- ========== 设置项行 ========== -->
<Style x:Key="SettingRow" TargetType="Border">
<Setter Property="Padding" Value="16,14" />
<Setter Property="BorderBrush" Value="#F0F1F3" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
</Style>
<!-- ========== 设置项标题 ========== -->
<Style x:Key="SettingTitle" TargetType="TextBlock">
<Setter Property="FontSize" Value="14" />
<Setter Property="Foreground" Value="#1F2329" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
<!-- ========== 设置项说明 ========== -->
<Style x:Key="SettingDesc" TargetType="TextBlock">
<Setter Property="FontSize" Value="12" />
<Setter Property="Foreground" Value="#8A9099" />
<Setter Property="Margin" Value="0,4,0,0" />
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
<!-- ========== 页面标题 ========== -->
<Style x:Key="PageTitle" TargetType="TextBlock">
<Setter Property="FontSize" Value="22" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Foreground" Value="#1F2329" />
<Setter Property="Margin" Value="0,0,0,4" />
</Style>
<Style x:Key="PageSubtitle" TargetType="TextBlock">
<Setter Property="FontSize" Value="13" />
<Setter Property="Foreground" Value="#8A9099" />
<Setter Property="Margin" Value="0,0,0,24" />
</Style>
<!-- ========== 开关样式 ========== -->
<Style x:Key="ToggleSwitch" TargetType="CheckBox">
<Setter Property="Width" Value="44" />
<Setter Property="Height" Value="24" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox">
<Border
x:Name="Track"
Width="44"
Height="24"
Background="#D0D3D8"
CornerRadius="12">
<Ellipse
x:Name="Thumb"
Width="18"
Height="18"
Margin="3,0,0,0"
HorizontalAlignment="Left"
Fill="White" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Track" Property="Background" Value="#0078D4" />
<Setter TargetName="Thumb" Property="HorizontalAlignment" Value="Right" />
<Setter TargetName="Thumb" Property="Margin" Value="0,0,3,0" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Track" Property="Opacity" Value="0.9" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
@@ -1,21 +1,37 @@
<UserControl x:Class="_29WxOrderWpf.UserControls.UcWaterMarkTextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.UserControls"
mc:Ignorable="d"
d:DesignHeight="28" d:DesignWidth="100">
<UserControl.Resources>
<ResourceDictionary>
<local:WaterMarkVisibilityConverter x:Key="WaterMarkVisibility"/>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<TextBox x:Name="txt" Text="{Binding Text, Mode=TwoWay}" Style="{StaticResource BaseRoundCornerTextBoxStyle}" BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="{Binding TextBorderThickness}"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Center" TextWrapping="{Binding TextWrapping}" TextChanged="txt_TextChanged"/>
<TextBlock x:Name="tbWaterMark" Text="{Binding WaterMark}" Margin="4,0,4,0" VerticalAlignment="Center" IsHitTestVisible="False" Foreground="DarkGray"
Visibility="{Binding ElementName=txt,Path=Text,Converter={StaticResource WaterMarkVisibility}}"></TextBlock>
</Grid>
<UserControl
x:Class="_29WxOrderWpf.UserControls.UcWaterMarkTextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.UserControls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="28"
d:DesignWidth="100"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<local:WaterMarkVisibilityConverter x:Key="WaterMarkVisibility" />
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<TextBox
x:Name="txt"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
VerticalContentAlignment="Center"
BorderBrush="{StaticResource pageColorBrush}"
BorderThickness="{Binding TextBorderThickness}"
Style="{StaticResource BaseRoundCornerTextBoxStyle}"
Text="{Binding Text, Mode=TwoWay}"
TextChanged="txt_TextChanged"
TextWrapping="{Binding TextWrapping}" />
<TextBlock
x:Name="tbWaterMark"
Margin="4,0,4,0"
VerticalAlignment="Center"
Foreground="DarkGray"
IsHitTestVisible="False"
Text="{Binding WaterMark}"
Visibility="{Binding ElementName=txt, Path=Text, Converter={StaticResource WaterMarkVisibility}}" />
</Grid>
</UserControl>
+77 -33
View File
@@ -1,55 +1,99 @@
<UserControl x:Class="_29WxOrderWpf.UserControls.UcWindowBoxes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.UserControls"
mc:Ignorable="d" Width="Auto" Height="Auto"
d:DesignHeight="30" d:DesignWidth="60" Background="Transparent" Loaded="WindowBoxes_Loaded">
<Grid Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<UserControl
x:Class="_29WxOrderWpf.UserControls.UcWindowBoxes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.UserControls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Width="Auto"
Height="Auto"
d:DesignHeight="30"
d:DesignWidth="60"
Background="Transparent"
Loaded="WindowBoxes_Loaded"
mc:Ignorable="d">
<Grid Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!--<Border Background="{StaticResource imgBrushCloseHover}" Width="17" Height="17" Margin="4">
<!--<Border Background="{StaticResource imgBrushCloseHover}" Width="17" Height="17" Margin="4">
</Border>
<Border Grid.Column="1" Width="17" Height="17" Margin="4">
<Image Source="{StaticResource imgCloseHover}"/>
</Border>-->
<!--不使用静态资源,在用户控件嵌套时,会发生预览错误-->
<local:UcImageButton x:Name="btnMin" Grid.Column="0" Width="17" Height="17" Background="Transparent" BorderThickness="0" Margin="4"
ButtonImage="{StaticResource imgMin}" MouseOverButtonImage="{StaticResource imgMinHover}" MousePressButtonImage="{StaticResource imgMinHover}"/>
<local:UcImageButton x:Name="btnMax" Grid.Column="1" Width="17" Height="17" Background="Transparent" BorderThickness="0" Visibility="Collapsed" Margin="4"
ButtonImage="{StaticResource imgMax}" MouseOverButtonImage="{StaticResource imgMaxHover}" MousePressButtonImage="{StaticResource imgMaxHover}"/>
<local:UcImageButton x:Name="btnNormal" Grid.Column="2" Width="17" Height="17" Background="Transparent" BorderThickness="0" Visibility="Collapsed" Margin="4"
ButtonImage="{StaticResource imgNormal}" MouseOverButtonImage="{StaticResource imgNormalHover}" MousePressButtonImage="{StaticResource imgNormalHover}"/>
<local:UcImageButton x:Name="btnClose" Grid.Column="3" Width="17" Height="17" Background="Transparent" BorderThickness="0" Margin="4"
ButtonImage="{StaticResource imgClose}" MouseOverButtonImage="{StaticResource imgCloseHover}" MousePressButtonImage="{StaticResource imgCloseHover}"/>
<!-- 不使用静态资源,在用户控件嵌套时,会发生预览错误 -->
<local:UcImageButton
x:Name="btnMin"
Grid.Column="0"
Width="17"
Height="17"
Margin="4"
Background="Transparent"
BorderThickness="0"
ButtonImage="{StaticResource imgMin}"
MouseOverButtonImage="{StaticResource imgMinHover}"
MousePressButtonImage="{StaticResource imgMinHover}" />
<local:UcImageButton
x:Name="btnMax"
Grid.Column="1"
Width="17"
Height="17"
Margin="4"
Background="Transparent"
BorderThickness="0"
ButtonImage="{StaticResource imgMax}"
MouseOverButtonImage="{StaticResource imgMaxHover}"
MousePressButtonImage="{StaticResource imgMaxHover}"
Visibility="Collapsed" />
<local:UcImageButton
x:Name="btnNormal"
Grid.Column="2"
Width="17"
Height="17"
Margin="4"
Background="Transparent"
BorderThickness="0"
ButtonImage="{StaticResource imgNormal}"
MouseOverButtonImage="{StaticResource imgNormalHover}"
MousePressButtonImage="{StaticResource imgNormalHover}"
Visibility="Collapsed" />
<local:UcImageButton
x:Name="btnClose"
Grid.Column="3"
Width="17"
Height="17"
Margin="4"
Background="Transparent"
BorderThickness="0"
ButtonImage="{StaticResource imgClose}"
MouseOverButtonImage="{StaticResource imgCloseHover}"
MousePressButtonImage="{StaticResource imgCloseHover}" />
<!--<local:UcImageButton x:Name="btnMin" Grid.Column="0" Width="17" Height="17" Background="Transparent" BorderThickness="0" Margin="4"
ButtonImage="/Resources/WindowBoxes/min.png"
<!--<local:UcImageButton x:Name="btnMin" Grid.Column="0" Width="17" Height="17" Background="Transparent" BorderThickness="0" Margin="4"
ButtonImage="/Resources/WindowBoxes/min.png"
MouseOverButtonImage="/Resources/WindowBoxes/min.hover.png"
MousePressButtonImage="/Resources/WindowBoxes/min.hover.png" />
<local:UcImageButton x:Name="btnMax" Grid.Column="1" Width="17" Height="17" Background="Transparent" BorderThickness="0" Visibility="Collapsed" Margin="4"
ButtonImage="/Resources/WindowBoxes/max.png"
ButtonImage="/Resources/WindowBoxes/max.png"
MouseOverButtonImage="/Resources/WindowBoxes/max.hover.png"
MousePressButtonImage="/Resources/WindowBoxes/max.hover.png" />
<local:UcImageButton x:Name="btnNormal" Grid.Column="2" Width="17" Height="17" Background="Transparent" BorderThickness="0" Visibility="Collapsed" Margin="4"
ButtonImage="/Resources/WindowBoxes/normal.png"
ButtonImage="/Resources/WindowBoxes/normal.png"
MouseOverButtonImage="/Resources/WindowBoxes/normal.hover.png"
MousePressButtonImage="/Resources/WindowBoxes/normal.hover.png" />
<local:UcImageButton x:Name="btnClose" Grid.Column="3" Width="17" Height="17" Background="Transparent" BorderThickness="0" Margin="4"
ButtonImage="/Resources/WindowBoxes/close.png"
ButtonImage="/Resources/WindowBoxes/close.png"
MouseOverButtonImage="/Resources/WindowBoxes/close.hover.png"
MousePressButtonImage="/Resources/WindowBoxes/close.hover.png" />-->
<!--<Button x:Name="btnMin" Grid.Column="0" Width="17" Height="17" Background="Transparent" BorderThickness="0" Margin="4">
<!--<Button x:Name="btnMin" Grid.Column="0" Width="17" Height="17" Background="Transparent" BorderThickness="0" Margin="4">
<Border>
<Grid>
<Image Source="/Resources/WindowBoxes/min.png" Stretch="Uniform"/>
@@ -81,5 +125,5 @@
</Grid>
</Border>
</Button>-->
</Grid>
</Grid>
</UserControl>
@@ -0,0 +1,267 @@
using _29WxOrderWpf.CefHelper;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Ctrls.OrderCtrls;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using CefSharp;
using CefSharp.Handler;
using CefSharp.Wpf;
using NaiBa.Util.Extension;
using Org.BouncyCastle.Asn1.Ocsp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
using TemuKJD.ToolForms;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.CefTools;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
namespace _29WxOrderWpf.ViewModels
{
/// <summary>
/// 拼多多买手移动版登录窗口 视图模型(WPF 版 TaobaoLoginForm)
/// </summary>
public class BaiduGetWaybillInfoViewModel : PropertyNotifyObject
{
// 拼多多买手退货退款售后地址
// https://mobile.yangkeduo.com/complaint.html?order_sn=260718-101481213440980&after_sales_reason=0&after_sales_type=2&after_sales_code=1002
public static BaiduGetWaybillInfoViewModel BaiduGetWaybillInfoInstance { get; set; } = null;
/// <summary>浏览器创建完成后触发(视图在此把浏览器加入可视树)</summary>
public event Action<ChromiumWebBrowser> BrowserCreated;
/// <summary>请求关闭窗口</summary>
public event Action RequestClose;
private string CookieHead { get; set; } = "baidu.com";
public string InitUrl { get; set; } = "";
private string MainUrl = "https://www.baidu.com/";
public ChromiumWebBrowser CefWebBrowser { get; private set; }
private string currentUrl = "";
private volatile bool _isWindowLoaded = false;
#region 界面绑定属性
public oms_wei_order_item_info OrderItem
{
get { return this.GetValue(x => x.OrderItem); }
set { this.SetValue(x => x.OrderItem, value); }
}
/// <summary>地址栏</summary>
public string Address
{
get { return this.GetValue(x => x.Address); }
set { this.SetValue(x => x.Address, value); }
}
/// <summary>物流信息</summary>
public string LatestWaybillStr
{
get { return this.GetValue(x => x.LatestWaybillStr); }
set { this.SetValue(x => x.LatestWaybillStr, value); }
}
public bool IsLoading
{
get { return this.GetValue(x => x.IsLoading); }
set { this.SetValue(x => x.IsLoading, value); }
}
#endregion
#region 命令
public ICommand ReloadCommand { get; }
public ICommand SetRejectStatusCommand { get; }
#endregion
public BaiduGetWaybillInfoViewModel(oms_wei_order_item_info orderItem)
{
IsLoading = true;
BaiduGetWaybillInfoInstance = this;
OrderItem = orderItem;
ReloadCommand = new DelegateCommand(Reload);
SetRejectStatusCommand = new DelegateCommand(SetRejectStatus);
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public async Task Start()
{
await AutoLogin();
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
/// <summary>
/// 自动登录店铺后台
/// </summary>
private async Task AutoLogin()
{
_ = Application.Current.Dispatcher.InvokeAsync(async () =>
{
if (CefWebBrowser == null)
{
if (!string.IsNullOrEmpty(InitUrl))
CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(InitUrl, false);
else
CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(MainUrl, false);
LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler();
resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete;
resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad;
CefWebBrowser.RequestHandler = new LocalRequestHandler(resourceRequestHandler);
var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
CefWebBrowser.LifeSpanHandler = lifeSapnHandler;
//CefWebBrowser.KeyboardHandler = new KeyboardHandler();
CefWebBrowser.KeyboardHandler = new CefKeyboardHandler();
CefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
CefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
CefWebBrowser.LoadError += CefWebBrowser_LoadError;
// 通知视图把浏览器加入可视树(必须在等待浏览器初始化之前完成)
BrowserCreated?.Invoke(CefWebBrowser);
}
//chat-submit-button
while (CefWebBrowser == null || CefWebBrowser.IsLoading)
{
Thread.Sleep(100);
}
await Task.Run(() =>
{
Thread.Sleep(4000);
IsLoading = false;
if (string.IsNullOrEmpty(LatestWaybillStr))
{
var jsStr = "document.getElementById('chat-submit-button').click();";
var client = CefWebBrowser.GetDevToolsClient();
if (client != null)
{
client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
}
}
});
});
}
private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e)
{
}
private void CefWebBrowser_AddressChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (Application.Current?.Dispatcher != null)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
currentUrl = e.NewValue.ParseToString();
Address = e.NewValue.ParseToString();
}));
}
}
private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
//js绑定C#对象 html页面内声明绑定的C#对象
StringBuilder sb = new StringBuilder();
sb.Append("(function(){");
sb.Append("CefSharp.BindObjectAsync('shopObj');");
sb.Append("})();");
CefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sb.ToString());
}
private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request)
{
return false;
}
private async void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
{
await DoResourceLoadComplete(url, responseData);
}
private async Task DoResourceLoadComplete(string url, string responseData)
{
if (url.Contains("https://alayn.baidu.com/express/appdetail/pc_express"))
{
await Task.Run(async () =>
{
if (responseData.Contains("\"status\":0"))
{
//jsonp_1790501236188_28581({"status":0,"error_code":0,"msg":"","data":{"context":[{"time":1790324628,"desc":"您的快件已退回签收。如有疑问请联系网点,网点电话:95554,投诉电话:95554。感谢使用圆通速递,期待再次为您服务!","zone":""},{"time":1790324332,"desc":"【广东省广州市番禺区火车南站】的周继双(17396260642)正在为您派件(95161和18521号段的上海号码为圆通快递员专属号码,请放心接听。如遇物流问题,请联系快递员为您解决,或联系网点电话:18521191496,或致电专属客服95554)","zone":""},{"time":1790312940,"desc":"您的快件已经到达【广东省广州市番禺区沙湾】【物流问题请致电(专属热线:95554)更快解决】","zone":""},{"time":1790287250,"desc":"您的快件离开【佛山转运中心】,已发往【广东省广州市番禺区沙湾】","zone":""},{"time":1790284964,"desc":"您的快件已经到达【佛山转运中心】【物流问题请致电(专属热线:95554)更快解决】","zone":""},{"time":1790272720,"desc":"您的快件离开【深圳转运中心】,已发往【佛山转运中心】","zone":""},{"time":1790272619,"desc":"您的快件已经到达【深圳转运中心】【物流问题请致电(专属热线:95554)更快解决】","zone":""},{"time":1790263927,"desc":"您的快件离开【广东省东莞市凤岗】,已发往【深圳转运中心】","zone":""},{"time":1790263156,"desc":"您的快件已经到达【广东省东莞市凤岗】【物流问题请致电(专属热线:95554)更快解决】","zone":""},{"time":1790257882,"desc":"您的快件已被【广东省东莞市凤岗】安排退回,退回原因:客户要求退回","zone":""},{"time":1790257874,"desc":"发件人拦截,快件将原路退回或更改派送地址!如有疑问请联系【广东省东莞市凤岗】(专属客服电话:95554)","zone":""},{"time":1790164947,"desc":"您的快件已到达[喵站](浸校塘喵站)兔喜快递超市(浸校塘东良巷店),请及时取件,如有取件码问题或找不到包裹等问题,请联系站点:13556614729,或联系快递员:18521194191,或联系网点电话:18521871340,或致电专属客服95554。感谢使用圆通速递,期待再次为您服务!","zone":""},{"time":1790139598,"desc":"【广东省东莞市凤岗】的黎志威(18521194191)正在为您派件(95161和18521号段的上海号码为圆通快递员专属号码,请放心接听。如遇物流问题,请联系快递员为您解决,或联系网点电话:18521871340,或致电专属客服95554)","zone":""},{"time":1790139558,"desc":"您的快件已经到达【广东省东莞市凤岗】【物流问题请致电(专属热线:95554)更快解决】","zone":""},{"time":1790124801,"desc":"您的快件离开【深圳转运中心】,已发往【广东省东莞市凤岗】","zone":""},{"time":1790124513,"desc":"您的快件已经到达【深圳转运中心】【物流问题请致电(专属热线:95554)更快解决】","zone":""},{"time":1790111473,"desc":"您的快件离开【佛山转运中心】,已发往【深圳转运中心】","zone":""},{"time":1790111393,"desc":"您的快件已经到达【佛山转运中心】【物流问题请致电(专属热线:95554)更快解决】","zone":""},{"time":1790107910,"desc":"您的快件离开【广东省广州市番禺区火车南站】,已发往【佛山转运中心】","zone":""},{"time":1790104565,"desc":"您的快件在【广东省广州市番禺区火车南站】已揽收,揽收人: 董伟咏(18521870969)【物流问题请致电(专属热线:95554)更快解决】","zone":""}],"status":"1","state":"3","officalService":{"comCode":"yuantong","com":"圆通","comName":"圆通速递","urlDesc":"官网地址:","url":"https://www.yto.net.cn/","logo":"https://cityservice-hb.cdn.bcebos.com/amis/img/b5f54f0b2d6b.png","servicePhoneDesc":"官方电话:","servicePhone":"95554","service":[{"url":"https://www.yto.net.cn/ytoExpress/subCreatePages/create","name":"我要寄件"},{"url":"https://www.yto.net.cn/ytoExpress/querySupport/standardPrice","name":"运价查询"},{"url":"https://online.yto.net.cn/#/","name":"在线客服"}]}}})
LatestWaybillStr = BaseRegex.GetStringJson(ref responseData, "desc");
if (LatestWaybillStr.Contains("退回") || LatestWaybillStr.Contains("拒收") || LatestWaybillStr.Contains("拦截"))
{
if (!LatestWaybillStr.Contains("√"))
LatestWaybillStr = "√ " + LatestWaybillStr;
var transitOrder = OrderItem.ItemTransitOrderWithVoid;
if (transitOrder.has_reject != 99)
{
var url = BaseClass.Build29WxObjString("order/wx_update_transit_order_reject_status");
var data = UserLogin.GetSignaturex();
data += "&order_no=" + OrderItem.order_id;
data += "&order_sku_id=" + OrderItem.sku_id;
data += "&has_reject=" + 99;
var html = GetHtml.PostUtf8(url, data);
transitOrder.has_reject = 99;
OrderListCtrl.InitOrderItemObservableProp(OrderItem);
MainWindow.Instance.Dispatcher.Invoke(() => { MainWindow.Instance.orderListCtrl.FilterOneOrder(OrderItem.ItemOrder); });
}
}
}
});
}
}
private void SetRejectStatus()
{
}
private void Reload()
{
if (CefWebBrowser != null)
{
if (Address != "about:blank")
CefWebBrowser.Load(Address);
else
CefWebBrowser.Load(MainUrl);
}
}
}
}
@@ -0,0 +1,261 @@
using _29WxOrderWpf.BaseWindows;
using WxOrder.Framework.Commons;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using AllBase.Model.Result;
using NaiBa.Util.Extension;
using Newtonsoft.Json.Linq;
using NPOI.HSSF.Record;
using Org.BouncyCastle.Crypto.Paddings;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Work;
using Work.BaseForms;
using Work.SearchSame;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
namespace _29WxOrderWpf.ViewModels;
public class BuyMapSkuViewModel : PropertyNotifyObject
{
public static BuyMapSkuViewModel BuyMapSkuInstance { get; set; }
/// <summary>
/// 请求关闭窗口
/// </summary>
public event Action RequestClose;
private volatile bool _isWindowLoaded = false;
public oms_wei_order_item_info OrderItem
{
get { return this.GetValue(x => x.OrderItem); }
set { this.SetValue(x => x.OrderItem, value); }
}
public ObservableCollection<WXBuyMapSkusInfo> BuyMapSkus
{
get { return this.GetValue(x => x.BuyMapSkus); }
set { this.SetValue(x => x.BuyMapSkus, value); }
}
public ObservableCollection<frontSkuInfo3> FrontSkuInfos
{
get { return this.GetValue(x => x.FrontSkuInfos); }
set { this.SetValue(x => x.FrontSkuInfos, value); }
}
public string ShopGoodsName
{
get { return this.GetValue(x => x.ShopGoodsName); }
set { this.SetValue(x => x.ShopGoodsName, value); }
}
public string ShopSkuName
{
get { return this.GetValue(x => x.ShopSkuName); }
set { this.SetValue(x => x.ShopSkuName, value); }
}
public string ShopSkuPrice
{
get { return this.GetValue(x => x.ShopSkuPrice); }
set { this.SetValue(x => x.ShopSkuPrice, value); }
}
//pddFrontGoods3Lite
public BuyMapSkuViewModel(oms_wei_order_item_info orderItem)
{
if (BuyMapSkuInstance != null)
BuyMapSkuInstance.RequestClose.Invoke();
BuyMapSkuInstance = this;
OrderItem = orderItem;
if (orderItem != null)
{
this.ShopGoodsName = orderItem.title;
this.ShopSkuName = orderItem.SkuAttrStr;
this.ShopSkuPrice = (orderItem.real_price * 0.01m).ParseToString();
}
if (GlobalConfig.CurrentBuyPlatform == "pdd")
{
if (orderItem?.PddBuyMapSkus != null && orderItem?.PddBuyMapSkus.Count > 0)
{
BuyMapSkus = new ObservableCollection<WXBuyMapSkusInfo>(orderItem.PddBuyMapSkus);
SetCurrentFrontSkuInfo3(BuyMapSkus?.FirstOrDefault());
}
}
else if (GlobalConfig.CurrentBuyPlatform == "tb")
{
if (orderItem?.TbBuyMapSkus != null && orderItem?.TbBuyMapSkus.Count > 0)
{
BuyMapSkus = new ObservableCollection<WXBuyMapSkusInfo>(orderItem.TbBuyMapSkus);
SetCurrentFrontSkuInfo3(BuyMapSkus?.FirstOrDefault());
}
}
}
public void SetCurrentFrontSkuInfo3(WXBuyMapSkusInfo skuInfo)
{
foreach (var info in BuyMapSkus)
{
info.IsChecked = false;
}
skuInfo.IsChecked = true;
FrontSkuInfos = new ObservableCollection<frontSkuInfo3>(skuInfo?.pdd_front_goods3_Lite.skus);
// 把名称给附上
foreach (var sku in FrontSkuInfos)
{
sku.GoodsNameStr = skuInfo?.pdd_front_goods3_Lite.goodsName;
}
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
_isWindowLoaded = true;
Task.Run(() =>
{
// todo get skus
});
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
public async Task SetOrderMapSku(frontSkuInfo3 upSku)
{
WXBuyMapSkusInfo mapSkuProd = null;
if (GlobalConfig.CurrentBuyPlatform == "pdd")
mapSkuProd = OrderItem.PddBuyMapSkus.FirstOrDefault(s => s.map_goods_id == upSku.goodsId.ParseToString());
if (GlobalConfig.CurrentBuyPlatform == "tb")
mapSkuProd = OrderItem.TbBuyMapSkus.FirstOrDefault(s => s.map_goods_id == upSku.goodsId.ParseToString());
if (mapSkuProd == null)
return;
var mapSku = mapSkuProd.pdd_front_goods3_Lite.skus.FirstOrDefault(s => string.Join(",", s.specs.Select(sp => sp.spec_value)) == upSku.SpecNameStr);
if (mapSku == null)
return;
var mapGoodsName = mapSkuProd.map_goods_name;
var mapSkuName = string.Join(",", mapSku.specs.Select(sp => sp.spec_value));
var mapGoodsId = mapSkuProd.map_goods_id;
var mapSkuId = mapSku.skuId.ParseToString();
var sendProvince = mapSkuProd.map_send_address;
var platform = mapSkuProd.platform;
string cmbTransitWarehouse = "";
string txtBuyTransitWarehouse = "";
var transitWarehouse = TransitWarehouseData.TransitWarehouseList.FirstOrDefault(t => t.TransId == mapSkuProd.transit_warehouse_id);
if (transitWarehouse != null)
{
cmbTransitWarehouse = transitWarehouse?.TransName + " " + transitWarehouse?.TransFullAddress;
txtBuyTransitWarehouse = transitWarehouse?.TransFullAddress;
}
var spuCode = OrderItem.out_product_id.IsNullOrEmpty() ? OrderItem.product_id : OrderItem.out_product_id;
var skuCode = OrderItem.out_sku_id.IsNullOrEmpty() ? OrderItem.SkuAttrStr : OrderItem.out_sku_id;
if (spuCode.IsNullOrEmpty())
spuCode = OrderItem.product_id;
if (await SaveSkuMap(spuCode, skuCode, mapGoodsName, mapSkuName, mapGoodsId, mapSkuId, transitWarehouse, sendProvince, platform))
RequestClose?.Invoke();
}
public async Task<bool> SaveSkuMap(string spuCode, string skuCode, string mapGoodsName,
string mapSkuName, string mapGoodsId, string mapSkuId, TransitWarehouseParam transitWarehouse, string sendProvince, string platform)
{
if (transitWarehouse == null)
{
BaseMsgForm.ShowError("仓库不能为空");
return false;
}
string url;
string upSpuCode = spuCode;
string upSkuCode = skuCode;
var data = UserLogin.GetSignaturex()
+ "&spu_code=" + GetHtml.UrlEncodeUtf8(upSpuCode)
+ "&sku_code=" + GetHtml.UrlEncodeUtf8(upSkuCode)
+ "&main_user_name=" + BaseClass.MainUserName
+ "&map_goods_name=" + mapGoodsName
+ "&map_spec_name=" + mapSkuName
+ "&map_goods_id=" + mapGoodsId
+ "&map_sku_id=" + mapSkuId
+ "&map_send_address=" + sendProvince
+ "&transit_warehouse_id=" + transitWarehouse?.TransId;
data += "&platform=" + platform;
url = BaseClass.Build29WxObjString("order/wx_add_mdy_buy_prod_map");
var result = await GetHtml.PostUtf8Async(url, data);
if (!result.Contains("\"code\":200"))
result = await GetHtml.PostUtf8Async(url, data);
if (!result.Contains("\"code\":200"))
{
BaseMsgForm.ShowError("保存失败" + BaseRegex.GetStringJson(ref result, "msg") + ",请稍后重试");
return false;
}
else
{
var urlMap = BaseClass.Build29WxObjString("order/wx_get_buy_prod_map");
var dataMap = UserLogin.GetSignaturex()
+ "&spu_codes=" + upSpuCode;
//dataMap += "&sku_codes=" + upSkuCode;
dataMap += "&main_user_name=" + BaseClass.MainUserName;
var resultMap = await GetHtml.PostUtf8Async(urlMap, dataMap);
if (string.IsNullOrEmpty(resultMap) || !resultMap.Contains("\"code\":200"))
resultMap = await GetHtml.PostUtf8Async(urlMap, dataMap);
if (string.IsNullOrEmpty(resultMap) || !resultMap.Contains("\"code\":200"))
{
}
else
{
List<WXBuyMapInfo> buyMapList = new List<WXBuyMapInfo>();
try
{
buyMapList = JsonHelper.DeserializeJsonToList<WXBuyMapInfo>(JObject.Parse(resultMap)["data"].ParseToString());
GlobalConfig.BuyMapList.RemoveAll(b => buyMapList.Any(map => b.spu_code == map.spu_code && b.sku_code == map.sku_code));
GlobalConfig.BuyMapList.AddRange(buyMapList);
}
catch
{
}
var map = buyMapList.FirstOrDefault(b => b.spu_code == upSpuCode && b.sku_code == upSkuCode);
if (map != null)
{
foreach (var order in GlobalConfig.lstOrder)
{
if (order.IsWaitBuy)
{
foreach (var item in order.orderItems)
{
if ((item.out_product_id == map.spu_code && item.out_sku_id == map.sku_code) ||
(item.out_product_id == map.spu_code && item.SkuAttrStr == map.sku_code) ||
(item.product_id == map.spu_code && item.out_sku_id == map.sku_code) ||
(item.product_id == map.spu_code && item.SkuAttrStr == map.sku_code))
{
item.PddBuyMap = map;
item.SetOrderItemTextProperty();
// todo 此处刷新一条可能不够
MainWindow.Instance.orderListCtrl.FilterOneOrder(order, false);
}
}
}
}
}
}
BaseMsgWindow.ShowInfo("保存成功!");
return true;
}
}
}
@@ -0,0 +1,117 @@
using _29WxOrderWpf.BaseWindows;
using WxOrder.Framework.Commons;
using AllBase;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using AllBase.Model.Result;
using NaiBa.Util.Extension;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.Forms.ShopForms;
namespace _29WxOrderWpf.ViewModels
{
/// <summary>
/// 更改运单号ViewModel
/// </summary>
public class ChangePickNoViewModel : PropertyNotifyObject
{
public oms_wei_order_item_info OrderItem
{
get { return this.GetValue(x => x.OrderItem); }
set { this.SetValue(x => x.OrderItem, value); }
}
public string PickNo
{
get { return this.GetValue(x => x.PickNo); }
set { this.SetValue(x => x.PickNo, value); }
}
public bool IsChangeingPickNo
{
get { return this.GetValue(x => x.IsChangeingPickNo); }
set { this.SetValue(x => x.IsChangeingPickNo, value); }
}
/// <summary>
/// 请求关闭窗口
/// </summary>
public event Action RequestClose;
#region 命令
public ICommand ChangePickNoCommand { get; }
#endregion
private volatile bool _isWindowLoaded = false;
public ChangePickNoViewModel(oms_wei_order_item_info _orderItem)
{
OrderItem = _orderItem;
IsChangeingPickNo = false;
PickNo = (_orderItem?.ItemOrder?.SyncWaybillPickNo).ParseToString();
ChangePickNoCommand = new DelegateCommand(ChangePickNo);
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
_isWindowLoaded = true;
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
public void ChangePickNo()
{
IsChangeingPickNo = false;
string orderId = OrderItem.order_id;
ShopLoginInfo shop = OrderItem.ItemOrder.Shop;
if (string.IsNullOrEmpty(PickNo))
{
BaseMsgWindow.ShowInfo("取件码不能为空");
return;
}
Task.Run(async () =>
{
var url4 = BaseClass.Build29WxObjString("vlc/UploadPickup");
var data4 = UserLogin.GetSignPostData(new
{
orderId = OrderItem.DirectPddBuyerOrder.order_sn,
pickupCode = PickNo,
});
var html4 = GetHtml.PostJson(url4, data4);
if (html4.Contains("\"code\":200"))
{
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
OrderItem.ItemOrder.SyncWaybillPickNo = PickNo;
IsChangeingPickNo = false;
BaseMsgWindow.ShowInfo("修改取件码成功");
RequestClose?.Invoke();
}));
}
else
{
BaseMsgWindow.ShowInfo("修改取件码失败" + BaseRegex.GetStringJson(ref html4, "msg"));
}
});
}
}
}
@@ -0,0 +1,265 @@
using _29WxOrderWpf.BaseWindows;
using WxOrder.Framework.Commons;
using AllBase;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using AllBase.Model.Result;
using NaiBa.Util.Extension;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.Forms.ShopForms;
namespace _29WxOrderWpf.ViewModels
{
/// <summary>
/// 更改运单号ViewModel
/// </summary>
public class ChangeWaybillViewModel : PropertyNotifyObject
{
public oms_wei_order_item_info OrderItem
{
get { return this.GetValue(x => x.OrderItem); }
set { this.SetValue(x => x.OrderItem, value); }
}
public string WaybillId
{
get { return this.GetValue(x => x.WaybillId); }
set { this.SetValue(x => x.WaybillId, value); }
}
public string CompensationWaybillId
{
get { return this.GetValue(x => x.CompensationWaybillId); }
set { this.SetValue(x => x.CompensationWaybillId, value); }
}
public bool IsChangeingWaybill
{
get { return this.GetValue(x => x.IsChangeingWaybill); }
set { this.SetValue(x => x.IsChangeingWaybill, value); }
}
public bool ChangeWaybillSuccess
{
get { return this.GetValue(x => x.ChangeWaybillSuccess); }
set { this.SetValue(x => x.ChangeWaybillSuccess, value); }
}
/// <summary>
/// 请求关闭窗口
/// </summary>
public event Action RequestClose;
#region 命令
public ICommand ChangeWaybillCommand { get; }
public ICommand SendCompensationDeliveryCommand { get; }
#endregion
private volatile bool _isWindowLoaded = false;
public ChangeWaybillViewModel(oms_wei_order_item_info _orderItem)
{
OrderItem = _orderItem;
//IsChangeingWaybill = true;
ChangeWaybillCommand = new DelegateCommand(ChangeWaybill);
SendCompensationDeliveryCommand = new DelegateCommand(SendCompensationDelivery);
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
_isWindowLoaded = true;
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
public void ChangeWaybill()
{
ChangeWaybillSuccess = false;
string orderId = OrderItem.order_id;
ShopLoginInfo shop = OrderItem?.ItemOrder?.Shop;
Task.Run(async () =>
{
// 查询订单是否在代发货中,如果代发需要取消代发
var apiSearchDropship = new WxApiBLL().WxApiDropshipSearch(shop, orderId, 100);
if (!apiSearchDropship.Contains("\"errcode\":0"))
{
BaseMsgWindow.ShowError("代发查询失败," + BaseRegex.GetStringJsonByRegs(ref apiSearchDropship, apiSearchDropship, "errmsg"));
return;
}
if (apiSearchDropship.Contains("ds_order_id_list") && !apiSearchDropship.Contains("\"ds_order_id_list\":[]"))
{
var dsOrderId = JsonHelper.JObjectParse(apiSearchDropship)["ds_order_id_list"].FirstOrDefault().ParseToString();
var apiCancelDropship = await new WxApiBLL().WxApiDropshipCancel(shop, OrderItem?.ItemOrder, dsOrderId);
if (!apiCancelDropship.Contains("\"errcode\":0"))
{
IsChangeingWaybill = false;
BaseMsgWindow.ShowError("取消代发失败!请确商品未加入代发!" + BaseRegex.GetStringJsonByRegs(ref apiSearchDropship, apiSearchDropship, "errmsg"));
return;
}
}
IsChangeingWaybill = true;
var rst = WxSimOrderSendBLL.initDeliveryInfo(shop, orderId);
// {"code":0,"orderDetail":{"commonInfo":{"orderId":"3736582386601580032","orderType":0,"statusStr":"待发货","status":20,"originalStatus":11,"openid":"ow5ty7Kyik_dSqtrivr5hY2t4cwY","createTime":1779540820,"createTimeStr":"2026-05-23 20:53","isPayScoreOrder":false,"isPayDone":true,"isVirtualOrder":false,"isAuthorizedAccount":false,"giftOrderType":"","isInspectOrder":false,"isCommissionOrderDone":false,"isRechargeOrder":false,"isExpediteOrder":false,"isOverTimeOrder":2,"isMultiPackage":false,"inspectType":0,"isGiftOrder":false,"isBuyTogetherOrder":false,"isLotteryOrder":false,"isEducationOrder":false,"hideGiftOrderAddressInfo":false,"cosignmentFlag":1,"isNationalSubsidy":0,"isSameCityOrder":false,"isNationalSubsidyMerchant":false,"isSupplyOrder":false},"orderProducts":{"orderProductInfo":[{"productId":"10000863142394","thumbImg":"https://wst.wxapp.tc.qq.com/161/20304/snscosdownload/SH/reserved/6a092e3a000107862152a36aa881bc1e000000a100004f50","title":"脂砚斋评石头记(全三册) 烫金珍藏版 彩绘绣像 双色印刷","skuId":"15274875174","saleParam":["默认"],"productType":1,"productCnt":1,"salePrice":"3400","spuCode":"9787555418979","skuCode":"BSEC12302592708637555055A","isPreSale":false,"isIflashbuy":false,"isFreeGift":false,"canAfterSale":true,"realPrice":3350,"perRealPrice":3350,"tags":[{"class":"black","desc":"7天无理由","iconUrl":"","mainUrl":"","tagType":4},{"class":"black","desc":"运费险","iconUrl":"","mainUrl":"","tagType":5}],"icons":[],"perExchangeScore":"","productSource":{"show":false},"afterSaleInfo":{"afterId":"","canAfterSale":true,"canNotAfterSaleReason":"","jumpUrl":"","title":"","content":"","afterSaleDoneStr":"","afterSaleDoneAmountStr":"","afterSaleDoneAmount":0,"afterSaleDoneProductCnt":0,"afterSaleIngProductCnt":0,"isGuaranteeIng":false,"hasFakeOnePayFourDoneGuarantee":false},"changeProduct":0,"afterSaleDoneProductCnt":0,"afterSaleIngProductCnt":0,"supplyProductId":"","supplyNickName":"","supplyOrderId":"","supplyAppid":""}],"priceInfo":{"productPrice":"3400","orderPrice":"3350","freight":0,"originalOrderPrice":"3400","estimateProductPrice":"3350","handingFee":"0","maxUnsplitAmount":"3350","totalDiscountedPrice":"50","merchantReceievePrice":"3350","platformActivityMerchantDiscountedPrice":"50"},"activityInfo":{},"presentFee":{}},"acceptInfo":{"decodeSensitiveTime":0,"editAddrInfo":{"applyEditAddrStatus":0,"applyEditAddrAuditStaff":"","applyEditAddrAuditTimeText":"","negotiationEditTextForB":"","negotiationEditTextForA":"","negotiationEditStatus":0,"negotiationEditHistory":[],"canNegotiation":true,"hasUnResolvedRequest":0,"hasHistoryMerchantEditAddr":0,"editHistory":[]},"customerNotes":"","merchantNotes":"","presentNotes":"","addressInfo":{"cityName":"宝鸡市","countyName":"眉县","provinceName":"陕西省","userName":"刘**","telNumber":"187****9569","detailInfo":"****","virtualOrderTelNumber":""},"virtualNumberInfo":{},"quota":{"code":0,"limit":10,"used":10,"hideSensitiveInfo":true},"rechargeData":{"label":"","content":"","deliverMethod":0},"addressErrType":0},"expressInfo":{"phone":"9569","deliveryProductInfo":[],"orderProductCnt":1,"deliveryCnt":0,"isIntracityOrder":false,"intracityTracking":null,"formatUnshippedProductList":[{"productId":"10000863142394","thumbImg":"https://wst.wxapp.tc.qq.com/161/20304/snscosdownload/SH/reserved/6a092e3a000107862152a36aa881bc1e000000a100004f50","title":"脂砚斋评石头记(全三册) 烫金珍藏版 彩绘绣像 双色印刷","skuId":"15274875174","saleParam":["默认"],"productType":1,"productCnt":1,"salePrice":"3400","spuCode":"9787555418979","skuCode":"BSEC12302592708637555055A","isPreSale":false,"isIflashbuy":false,"isFreeGift":false,"canAfterSale":true,"realPrice":3350,"perRealPrice":3350,"tags":[{"class":"black","desc":"7天无理由","iconUrl":"","mainUrl":"","tagType":4},{"class":"black","desc":"运费险","iconUrl":"","mainUrl":"","tagType":5}],"icons":[],"perExchangeScore":"","productSource":1,"afterSaleInfo":{"afterId":"","canAfterSale":true,"canNotAfterSaleReason":"","jumpUrl":"","title":"","content":"","afterSaleDoneStr":"","afterSaleDoneAmountStr":"","afterSaleDoneAmount":0,"afterSaleDoneProductCnt":0,"afterSaleIngProductCnt":0,"isGuaranteeIng":false,"hasFakeOnePayFourDoneGuarantee":false},"changeProduct":0,"afterSaleDoneProductCnt":0,"afterSaleIngProductCnt":0,"supplyProductId":"","supplyNickName":"","supplyOrderId":"","supplyAppid":""}],"product2Img":{"15274875174":"https://wst.wxapp.tc.qq.com/161/20304/snscosdownload/SH/reserved/6a092e3a000107862152a36aa881bc1e000000a100004f50"}},"ewaybillInfo":{"isAllPrintOne":false,"isOpen":false,"deliveryId":"","deliveryName":"","waybillId":""}},"sendAddressInfo":{"userName":"陈图书","postalCode":"","provinceName":"安徽省","cityName":"合肥市","countyName":"肥西县","detailInfo":"上派镇中盟电子产业园8栋一单元(东电梯3楼快递指定存放点)","telNumber":"13023098035","lat":0,"lng":0},"deliveryCompanyOptions":[{"label":"极兔Line truncated
if (!rst.Contains("\"code\":0"))
{
var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "err_msg", "error_msg", "errMsg", "errorMsg", "msg");
IsChangeingWaybill = false;
BaseMsgWindow.ShowInfo("修改订单物流失败 " + error);
return;
}
var statusStr = BaseRegex.GetStringJson(ref rst, "statusStr");
if (statusStr == "待发货")
{
// 待发货暂不处理
//{"orderId":"3736580679658008320","deliveryProduct":{"deliveryId":"YUNDA","waybillId":"313023381086999","isAllProduct":true,"deliverType":1}}
//{"code":0,"errcode":0,"errmsg":"ok"}
rst = WxSimOrderSendBLL.orderSendOut(shop, orderId, WaybillId);
if (!rst.Contains("\"code\":0"))
{
var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "err_msg", "error_msg", "errMsg", "errorMsg", "msg");
IsChangeingWaybill = false;
BaseMsgWindow.ShowInfo("修改订单物流失败 " + error);
return;
}
var url = BaseClass.Build29WxObjString("order/wx_update_erp_soft_remark");
var data = UserLogin.GetSignaturex();
if (OrderItem?.ItemOrder != null && !(OrderItem?.ItemOrder?.soft_remark).ParseToString().Contains("已修改物流"))
OrderItem.ItemOrder.soft_remark = ("已修改物流 " + OrderItem.ItemOrder.soft_remark).Trim();
data += "&order_id=" + OrderItem?.ItemOrder?.order_id;
data += "&soft_remark=" + OrderItem?.ItemOrder?.soft_remark;
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
ChangeWaybillSuccess = true;
IsChangeingWaybill = false;
BaseMsgWindow.ShowInfo("修改订单物流成功");
RequestClose?.Invoke();
}));
}
else
{
//{"orderId":"3736580679658008320","changeInfo":[{"old":{"deliveryId":"YUNDA","waybillId":"313023381086999","productInfos":[{"productId":"10000875072190","skuId":"15516018429","productCnt":1}]},"new":{"deliveryId":"OTHER","waybillId":"772064082455686","productInfos":[{"productId":"10000875072190","skuId":"15516018429","productCnt":1}]}}]}
//{"code":0,"errcode":0,"errmsg":""}
var orderExpressInfoObj = JsonHelper.JObjectParse(rst)["orderDetail"]["expressInfo"];
var orderExpressInfo = JsonHelper.DeserializeJsonToObject<WxOrderExpressInfo>(JsonHelper.SerializeObject(orderExpressInfoObj));
UpdateDeliverInfoParam param = new UpdateDeliverInfoParam();
param.orderId = orderId;
param.changeInfo = new List<Dictionary<string, UpdateDeliverChangeInfo>>();
foreach (var deliveryProductInfo in orderExpressInfo.deliveryProductInfo)
{
Dictionary<string, UpdateDeliverChangeInfo> dicChange = new Dictionary<string, UpdateDeliverChangeInfo>();
dicChange["old"] = new UpdateDeliverChangeInfo
{
deliveryId = deliveryProductInfo.deliveryId,
waybillId = deliveryProductInfo.waybillId,
productInfos = new List<UpdateDeliverProductInfo>()
};
dicChange["new"] = new UpdateDeliverChangeInfo
{
deliveryId = "OTHER",
waybillId = WaybillId,
productInfos = new List<UpdateDeliverProductInfo>()
};
foreach (var prod in deliveryProductInfo.productInfos)
{
dicChange["old"].productInfos.Add(new UpdateDeliverProductInfo() { productCnt = prod.productCnt, productId = prod.productId, skuId = prod.skuId });
dicChange["new"].productInfos.Add(new UpdateDeliverProductInfo() { productCnt = prod.productCnt, productId = prod.productId, skuId = prod.skuId });
}
param.changeInfo.Add(dicChange);
}
rst = WxSimOrderSendBLL.updateDeliveryInfo(shop, param);
var str = JsonHelper.SerializeObject(param);
if (!rst.Contains("\"code\":0"))
{
var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "err_msg", "error_msg", "errMsg", "errorMsg", "msg");
IsChangeingWaybill = false;
BaseMsgWindow.ShowInfo("修改订单物流失败 " + error);
return;
}
var url = BaseClass.Build29WxObjString("order/wx_update_erp_soft_remark");
var data = UserLogin.GetSignaturex();
if (OrderItem?.ItemOrder != null && !OrderItem.ItemOrder.soft_remark.ParseToString().Contains("已修改物流"))
OrderItem.ItemOrder.soft_remark = ("已修改物流 " + OrderItem.ItemOrder.soft_remark).Trim();
data += "&order_id=" + OrderItem?.ItemOrder?.order_id;
data += "&soft_remark=" + OrderItem?.ItemOrder?.soft_remark;
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
ChangeWaybillSuccess = true;
IsChangeingWaybill = false;
BaseMsgWindow.ShowInfo("修改订单物流成功");
RequestClose?.Invoke();
}));
}
});
}
public void SendCompensationDelivery()
{
var orderId = OrderItem.order_id;
var shop = OrderItem?.ItemOrder?.Shop;
// 模拟接口补发
//rst = WxSimOrderSendBLL.orderCompensationDelivery(shop, orderId, "ZTO", WaybillId, OrderItem.product_id, OrderItem.sku_id, OrderItem.sku_cnt.ParseToInt());
var rst = WxSimOrderSendBLL.orderCompensationDelivery(shop, orderId, "OTHER", CompensationWaybillId, OrderItem.product_id, OrderItem.sku_id, OrderItem.sku_cnt.ParseToInt());
var url = BaseClass.Build29WxObjString("order/wx_update_erp_soft_remark");
var data = UserLogin.GetSignaturex();
if (OrderItem?.ItemOrder != null && !OrderItem.ItemOrder.soft_remark.ParseToString().Contains("已补发包裹"))
OrderItem.ItemOrder.soft_remark = ("已补发包裹 " + OrderItem.ItemOrder.soft_remark).Trim();
data += "&order_id=" + OrderItem?.ItemOrder?.order_id;
data += "&soft_remark=" + OrderItem?.ItemOrder?.soft_remark;
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (!rst.Contains("\"code\":0"))
{
var error = BaseRegex.GetStringJsonByRegs(ref rst, rst, "err_msg", "error_msg", "errMsg", "errorMsg", "msg");
IsChangeingWaybill = false;
BaseMsgWindow.ShowError("订单补发失败 " + error);
return;
}
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
ChangeWaybillSuccess = true;
IsChangeingWaybill = false;
BaseMsgWindow.ShowInfo("订单补发成功");
RequestClose?.Invoke();
}));
}
}
}
@@ -0,0 +1,134 @@
using _29WxOrderWpf.BaseWindows;
using WxOrder.Framework.Commons;
using AllBase;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using AllBase.Model.Result;
using NaiBa.Util.Extension;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.Forms.ShopForms;
using Work.BaseForms;
namespace _29WxOrderWpf.ViewModels
{
/// <summary>
/// 更改运单号ViewModel
/// </summary>
public class EWaybillPathViewModel : PropertyNotifyObject
{
public oms_wei_order_info Order
{
get { return this.GetValue(x => x.Order); }
set { this.SetValue(x => x.Order, value); }
}
public string OrderId
{
get { return this.GetValue(x => x.OrderId); }
set { this.SetValue(x => x.OrderId, value); }
}
public string ExpressName
{
get { return this.GetValue(x => x.ExpressName); }
set { this.SetValue(x => x.ExpressName, value); }
}
public string WaybillId
{
get { return this.GetValue(x => x.WaybillId); }
set { this.SetValue(x => x.WaybillId, value); }
}
public bool IsGetWaybillPath
{
get { return this.GetValue(x => x.IsGetWaybillPath); }
set { this.SetValue(x => x.IsGetWaybillPath, value); }
}
public ObservableCollection<oms_wei_ewaybill_path> WaybillPathInfos
{
get { return this.GetValue(x => x.WaybillPathInfos); }
set { this.SetValue(x => x.WaybillPathInfos, value); }
}
/// <summary>
/// 请求关闭窗口
/// </summary>
public event Action RequestClose;
#region 命令
public ICommand GetEWaybillPathCommand { get; }
#endregion
private volatile bool _isWindowLoaded = false;
public EWaybillPathViewModel(oms_wei_order_info _order, string _waybillId, string _expressName)
{
Order = _order;
OrderId = Order?.order_id;
ExpressName = _expressName;
WaybillId = _waybillId;
IsGetWaybillPath = false;
GetEWaybillPathCommand = new DelegateCommand(GetEWaybillPath);
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
_isWindowLoaded = true;
GetEWaybillPath();
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
public void GetEWaybillPath()
{
string orderId = Order.order_id;
ShopLoginInfo shop = Order.Shop;
Task.Run(async () =>
{
IsGetWaybillPath = true;
var url = BaseClass.Build29WxObjString("order/wx_get_erp_ewaybill_path_list");
//var url = BaseClass.Build29WxObjString("order/wx_get_erp_ewaybill_path_latest_list");
var data = UserLogin.GetSignaturex();
//data += "&erp_order_id_in=" + order_id;
data += "&waybill_id_in=" + WaybillId;
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (!html.Contains("\"code\":200"))
{
BaseMsgWindow.ShowError("查询失败请重试");
return;
}
this.WaybillPathInfos = new ObservableCollection<oms_wei_ewaybill_path>(
JsonHelper.DeserializeJsonToList<oms_wei_ewaybill_path>(JObject.Parse(html)["data"].ParseToString()).OrderByDescending(p => p.update_time).ToList());
IsGetWaybillPath = false;
});
}
}
}
@@ -0,0 +1,543 @@
using _29WxOrderWpf.CefHelper;
using WxOrder.Framework.Commons;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using AllBase.Model.Result;
using CefSharp;
using CefSharp.Handler;
using CefSharp.Wpf;
using NaiBa.Util.Extension;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using TemuKJD.ToolForms;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.CefTools;
namespace _29WxOrderWpf.ViewModels
{
/// <summary>
/// 拼多多买手移动版登录窗口 视图模型(WPF 版 PddMobileLoginForm)
/// </summary>
public class PddMobileLoginViewModel : PropertyNotifyObject
{
// 拼多多买手退货退款售后地址
// https://mobile.yangkeduo.com/complaint.html?order_sn=260718-101481213440980&after_sales_reason=0&after_sales_type=2&after_sales_code=1002
Dictionary<BuyerLoginInfo, PddPickInfo> dicPddPickInfo = new Dictionary<BuyerLoginInfo, PddPickInfo>();
public static PddMobileLoginViewModel PddMobileLoginInstance { get; set; } = null;
/// <summary>浏览器创建完成后触发(视图在此把浏览器加入可视树)</summary>
public event Action<ChromiumWebBrowser> BrowserCreated;
/// <summary>请求关闭窗口</summary>
public event Action RequestClose;
public int CloseAfterSecond { get; set; }
private EnumOpenType _openType = EnumOpenType.manage;
public EnumOpenType OpenType
{
get { return _openType; }
set
{
_openType = value;
OnPropertyChanged(nameof(OpenType));
OnPropertyChanged(nameof(IsLoginMode));
}
}
public string InitUrl { get; set; } = "";
private string shopCookieHead = "yangkeduo.com";
private string shopLoginUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html";
private string shopMainUrl = "https://mobile.yangkeduo.com/index.html";
public ChromiumWebBrowser CefWebBrowser { get; private set; }
private BuyerLoginInfo buyer = null;
private List<ShopCompany> lstShopCompany = new List<ShopCompany>();
private string currentUrl = "";
private volatile bool _isWindowLoaded = false;
#region 界面绑定属性
/// <summary>用户名</summary>
public string UserName
{
get { return this.GetValue(x => x.UserName); }
set { this.SetValue(x => x.UserName, value); }
}
/// <summary>密码</summary>
public string PassWord
{
get { return this.GetValue(x => x.PassWord); }
set { this.SetValue(x => x.PassWord, value); }
}
/// <summary>地址栏</summary>
public string Address
{
get { return this.GetValue(x => x.Address); }
set { this.SetValue(x => x.Address, value); }
}
/// <summary>登录成功后关闭窗口</summary>
public bool IsCloseAfterLogin
{
get { return this.GetValue(x => x.IsCloseAfterLogin); }
set { this.SetValue(x => x.IsCloseAfterLogin, value); }
}
/// <summary>登录模式(显示扫码提示和导入PDDAccessToken面板)</summary>
public bool IsLoginMode
{
get { return this.GetValue(x => x.IsLoginMode); }
set { this.SetValue(x => x.IsLoginMode, value); }
}
/// <summary>导入的PDDAccessToken</summary>
public string AccessToken
{
get { return this.GetValue(x => x.AccessToken); }
set { this.SetValue(x => x.AccessToken, value); }
}
#endregion
#region 命令
public ICommand ReloadCommand { get; }
public ICommand LoginAgainCommand { get; }
public ICommand StopCommand { get; }
public ICommand CopyUserNameCommand { get; }
public ICommand CopyPasswordCommand { get; }
public ICommand SaveCookieCommand { get; }
#endregion
public PddMobileLoginViewModel(BuyerLoginInfo buyerInfo)
{
PddMobileLoginInstance = this;
buyer = buyerInfo;
UserName = buyerInfo?.buyer_name;
PassWord = ""; //DataOpenSSL.DecryptString(buyerInfo.Password);
IsCloseAfterLogin = true;
IsLoginMode = OpenType == EnumOpenType.login;
ReloadCommand = new DelegateCommand(Reload);
LoginAgainCommand = new DelegateCommand(LoginAgain);
StopCommand = new DelegateCommand(StopButton);
CopyUserNameCommand = new DelegateCommand(CopyUserName);
CopyPasswordCommand = new DelegateCommand(CopyPassword);
SaveCookieCommand = new DelegateCommand(SaveCookie);
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
IsLoginMode = OpenType == EnumOpenType.login;
_isWindowLoaded = true;
if (CloseAfterSecond > 0)
{
Task.Run(() =>
{
Thread.Sleep(1000 * CloseAfterSecond);
if (_isWindowLoaded)
{
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
if (_isWindowLoaded)
RequestClose?.Invoke();
}));
}
});
}
Task.Run(() =>
{
AutoLogin();
});
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
/// <summary>
/// 自动登录店铺后台
/// </summary>
private async void AutoLogin()
{
if (OpenType != EnumOpenType.login && buyer == null)
return;
_ = Application.Current.Dispatcher.InvokeAsync(async () =>
{
if (CefWebBrowser == null)
{
if (!string.IsNullOrEmpty(InitUrl))
CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(InitUrl, false);
else
CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(shopMainUrl, false);
LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler();
resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete;
resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad;
CefWebBrowser.RequestHandler = new LocalRequestHandler(resourceRequestHandler);
var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
CefWebBrowser.LifeSpanHandler = lifeSapnHandler;
CefWebBrowser.KeyboardHandler = new CefKeyboardHandler();
CefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
CefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
CefWebBrowser.LoadError += CefWebBrowser_LoadError;
// 通知视图把浏览器加入可视树(必须在等待浏览器初始化之前完成)
BrowserCreated?.Invoke(CefWebBrowser);
List<Cookie> cookieLst = new List<Cookie>();
try
{
if (buyer != null)
{
cookieLst = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(buyer?.cookie);
if (cookieLst == null)
cookieLst = new List<Cookie>();
}
}
catch
{
}
// cef138必须init后方可设置或删除cookie
while (!CefWebBrowser.IsBrowserInitialized || !CefWebBrowser.GetBrowser().MainFrame.IsValid)
await Task.Delay(20);
WPFCEFBrowser.DeleteCookie(CefWebBrowser.GetCookieManager(null));
//cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager
var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), CefWebBrowser.GetCookieManager(null));
foreach (var cook in cookieLst)
{
//var t = CEFBrowser.SetCookieAsync(cook.Domain.Trim('.'), cook.Name + "=" + cook.Value + ";", CefWebBrowser.GetCookieManager(null));
//t.Wait(5000);
}
//根据登录的具体店铺设置local storage
if (!string.IsNullOrEmpty(buyer?.buyer_id))
{
//var storageJsCode = "window.localStorage.setItem('" + "mall-info-id" + "', '" + shop.ShopId + "');\r\n";
//storageJsCode += "window.localStorage.setItem('" + "agentseller-mall-info-id" + "', '" + shop.ShopId + "');\r\n";
//while (!CefWebBrowser.IsBrowserInitialized || !CefWebBrowser.GetBrowser().MainFrame.IsValid)
// Thread.Sleep(20);
//CefWebBrowser.GetBrowser().MainFrame.ExecuteJavaScriptAsync(storageJsCode);
}
if (!string.IsNullOrEmpty(InitUrl))
CefWebBrowser.Load(InitUrl);
else
CefWebBrowser.Load(shopMainUrl);
//不是登录的话就此返回
if (OpenType != EnumOpenType.login)
{
return;
}
for (int i = 0; i < 50; i++)
{
if (CefWebBrowser.IsLoading)
await Task.Delay(100);
//Thread.Sleep(100);
}
await Task.Delay(Randomx.GetId(1500, 2000));
if (!_isWindowLoaded)
return;
while (!CefWebBrowser.Address?.StartsWith(shopLoginUrl) ?? false)
{
await Task.Delay(1000);
if (!_isWindowLoaded)
return;
}
}
});
}
private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e)
{
}
private void CefWebBrowser_AddressChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (Application.Current?.Dispatcher != null)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
currentUrl = e.NewValue.ParseToString();
Address = e.NewValue.ParseToString();
}));
}
}
private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
//js绑定C#对象 html页面内声明绑定的C#对象
StringBuilder sb = new StringBuilder();
sb.Append("(function(){");
sb.Append("CefSharp.BindObjectAsync('shopObj');");
sb.Append("})();");
CefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sb.ToString());
}
private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request)
{
return false;
}
private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
{
var data = responseData;
var send = sender;
if (data.Contains("\"pick_code\":\"取件码") /*|| data.Contains("21-2110")*/)
{
try
{
var combine_track_list = BaseRegex.GetJsonArrStrJson(ref data, "combine_track_list");
var noPickupPackageData = BaseRegex.GetJsonObjStrJson(ref data, "noPickupPackageData").FirstOrDefault();
if (!noPickupPackageData.IsNullOrEmpty() && send is ChromiumWebBrowser cef)
{
var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(buy => buy.wpf_browser == cef);
if (buyer != null)
{
dicPddPickInfo[buyer] = JsonHelper.DeserializeJsonToObject<PddPickInfo>(noPickupPackageData);
}
}
}
catch
{
}
}
if (url.Contains("https://mobile.yangkeduo.com/index.html") && OpenType == EnumOpenType.login)
{
Task.Run(() => { CefWebBrowser.Load("https://mobile.yangkeduo.com/personal.html"); });
}
if (url.Contains("https://mobile.yangkeduo.com/personal.html"))
{
if (OpenType == EnumOpenType.login)
{
Task.Run(() =>
{
var data = responseData;
if (data.Contains("\"success\":true") || data.Contains("nickname"))
{
var uid = BaseRegex.GetStringJson(ref data, "uid");
var nickname = BaseRegex.GetStringJson(ref data, "nickname");
var username = nickname;
if (!string.IsNullOrEmpty(nickname) && !string.IsNullOrEmpty(uid))
{
Thread.Sleep(2000);
List<Cookie> cookieList = WPFCEFBrowser.GetCookieList(shopCookieHead, CefWebBrowser.GetCookieManager(null));
var buyerUrl = BaseClass.Build29PDDObjString("user/add_buyer");
if (this.buyer == null || this.buyer.buyer_id != uid)
this.buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(b => b.buyer_id == uid);
if (this.buyer != null)
{
this.buyer.user_name = username;
this.buyer.buyer_nick = nickname;
this.buyer.cookie = JsonHelper.SerializeObject(cookieList);
buyerUrl = BaseClass.Build29PDDObjString("user/mdy_buyer");
}
var buyerData = UserLogin.GetSignaturex()
+ "&buyer_id=" + uid
+ "&buyer_name=" + username
+ "&buyer_nick=" + nickname;
var result = GetHtml.PostUtf8(buyerUrl, buyerData);
if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(buyerUrl, buyerData);
buyerUrl = BaseClass.Build29PDDObjString("user/mdy_buyer_cookie");
buyerData = UserLogin.GetSignaturex()
+ "&buyer_id=" + uid
+ "&status=" + "在线"
+ "&cookie=" + GetHtml.UrlEncodeUtf8(JsonHelper.SerializeObject(cookieList));
result = GetHtml.PostUtf8(buyerUrl, buyerData);
if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(buyerUrl, buyerData);
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
try
{
if (IsCloseAfterLogin)
RequestClose?.Invoke();
}
catch (Exception ex)
{ }
}));
}
}
});
}
}
}
private void StopButton()
{
}
private void CopyUserName()
{
if (!string.IsNullOrEmpty(UserName))
Clipboard.SetDataObject(UserName);
}
private void CopyPassword()
{
if (!string.IsNullOrEmpty(PassWord))
Clipboard.SetDataObject(PassWord);
}
private void Reload()
{
if (CefWebBrowser != null)
{
if (Address != "about:blank")
CefWebBrowser.Load(Address);
else
CefWebBrowser.Load(shopMainUrl);
}
}
private void LoginAgain()
{
if (this.currentUrl != shopLoginUrl)
this.CefWebBrowser?.Load(shopLoginUrl);
}
private void SaveCookie()
{
Cookie cookie = new Cookie();
cookie.Name = "PDDAccessToken";
cookie.Domain = "mobile.yangkeduo.com";
cookie.Expires = DateTime.Now.AddDays(465);
cookie.HttpOnly = true;
cookie.Secure = true;
cookie.Value = AccessToken.Trim();
if (this.CefWebBrowser != null)
{
var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(new List<Cookie> { cookie }), CefWebBrowser.GetCookieManager(null));
t.Wait(2000);
CefWebBrowser.Load("https://mobile.yangkeduo.com/personal.html");
}
}
#region 静态方法(检测/更新买手登录状态)
public static void CheckBuyerLogin(List<BuyerLoginInfo> checkBuyers, bool isShowProgress = true)
{
for (int i = 0; i < checkBuyers.Count; i++)
{
var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(v => v.buyer_id == checkBuyers[i].buyer_id);
var buys = GlobalConfig.PDDBuyerLoginList.Where(v => v.buyer_id == checkBuyers[i].buyer_id).ToList();
if (buyer == null)
continue;
// 先从服务端取最新cookie
var url = BaseClass.Build29PDDObjString("user/get_buyer");
var data = UserLogin.GetSignaturex();
data += "&buyer_ids=" + buyer.buyer_id;
data += "&page_size=1";
var result = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(url, data);
if (!result.Contains("\"code\":200"))
continue;
List<BuyerLoginInfo> loginInfoLst = JsonHelper.DeserializeJsonToList<BuyerLoginInfo>(JsonHelper.JObjectParse(result)["data"].ParseToString());
var serverBuyer = loginInfoLst.FirstOrDefault();
if (buyer != null && serverBuyer != null)
{
buyer.cookie = serverBuyer.cookie;
foreach (var buy in buys)
{
buy.cookie = serverBuyer.cookie;
}
}
if (buyer != null)
{
var loginResult = CheckBuyerLogin(buyer);
if (!loginResult.Contains("\"success\":true") && !loginResult.Contains("\"login\":true") && !loginResult.Contains("\"nickname\""))
{
buyer.cookie = "[]";
foreach (var buy in buys)
{
buy.status = "掉线";
buy.cookie = "[]";
}
}
else
{
foreach (var buy in buys)
{
buy.status = "在线";
}
}
UpdateServerBuyerCookies(buyer); // 店铺cookie和状态写入服务端
}
}
}
public static string CheckBuyerLogin(BuyerLoginInfo buyer, string refere = "https://mobile.yangkeduo.com/goods.html")
{
string url = "https://mobile.yangkeduo.com/proxy/api/api/apollo/v3/user/me?pdduid=" + buyer.buyer_id;
return HttpResponseYkdBLL.YangkeduoGetResponse(buyer, url, refere);
}
public static string UpdateServerBuyerCookies(BuyerLoginInfo buyer, string fromTool = null)
{
var url = BaseClass.Build29PDDObjString("user/mdy_buyer_cookie");
var data = UserLogin.GetSignaturex()
+ "&status=" + buyer.status
+ "&cookie=" + GetHtml.UrlEncodeUtf8(buyer.cookie)
+ "&buyer_id=" + buyer.buyer_id;
var result = GetHtml.PostUtf8(url, data);
if (!result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(url, data);
return result;
}
#endregion
}
}
@@ -0,0 +1,61 @@
using AllBase.Model.Config;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPFCommon.Models;
namespace _29WxOrderWpf.ViewModels;
public class SettingViewModel : BindableBaseEx
{
public const string SettingFileName = "setting";
public SettingViewModel()
{
}
/// <summary>版本号</summary>
public string Version
{
get => GetValue<string>();
private set => SetValue(value);
}
public bool AutoSwitchGiftType
{
get => GetValue<bool>();
set => SetValue(value);
}
public bool SwitchEnableDirectBuy
{
get => GetValue<bool>();
set => SetValue(value);
}
public bool SwitchEnablePddTransitTraditionalAddress
{
get => GetValue<bool>();
set => SetValue(value);
}
public Visibility ShowEnablePddTransitTraditionalAddress
{
get => GetValue<Visibility>();
set => SetValue(value);
}
public void Assign(SettingConfig config)
{
AutoSwitchGiftType = config.AutoSwitchGiftType;
SwitchEnableDirectBuy = config.SwitchEnableDirectBuy;
SwitchEnablePddTransitTraditionalAddress = config.SwitchEnablePddTransitTraditionalAddress;
ShowEnablePddTransitTraditionalAddress = config.ShowEnablePddTransitTraditionalAddress ? Visibility.Visible : Visibility.Collapsed;
}
public SettingConfig ToConfig()
{
return new SettingConfig
{
AutoSwitchGiftType = AutoSwitchGiftType,
SwitchEnableDirectBuy = SwitchEnableDirectBuy,
SwitchEnablePddTransitTraditionalAddress = SwitchEnablePddTransitTraditionalAddress,
};
}
}
@@ -0,0 +1,714 @@
using _29WxOrderWpf.CefHelper;
using WxOrder.Framework.Commons;
using AllBase;
using AllBase.Helper;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using CefSharp;
using CefSharp.Handler;
using CefSharp.Wpf;
using NaiBa.Util.Extension;
using Org.BouncyCastle.Asn1.Ocsp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using TemuKJD.ToolForms;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.CefTools;
namespace _29WxOrderWpf.ViewModels
{
/// <summary>
/// 拼多多买手移动版登录窗口 视图模型(WPF 版 TaobaoLoginForm)
/// </summary>
public class TaobaoLoginViewModel : PropertyNotifyObject
{
// 拼多多买手退货退款售后地址
// https://mobile.yangkeduo.com/complaint.html?order_sn=260718-101481213440980&after_sales_reason=0&after_sales_type=2&after_sales_code=1002
List<Process> cefSubProcesses = new List<Process>();
public static TaobaoLoginViewModel TaobaoLoginInstance { get; set; } = null;
/// <summary>浏览器创建完成后触发(视图在此把浏览器加入可视树)</summary>
public event Action<ChromiumWebBrowser> BrowserCreated;
/// <summary>请求关闭窗口</summary>
public event Action RequestClose;
public int CloseAfterSecond { get; set; }
private EnumOpenType _openType = EnumOpenType.manage;
public EnumOpenType OpenType
{
get { return _openType; }
set
{
_openType = value;
OnPropertyChanged(nameof(OpenType));
OnPropertyChanged(nameof(IsLoginMode));
}
}
public string InitUrl { get; set; } = "";
private string shopCookieHead = "taobao.com";
private string buyerLoginUrl = "https://login.taobao.com/havanaone/login/login.htm";
private string buyerMainUrl = "https://i.taobao.com/my_itaobao"; //"https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?";
public ChromiumWebBrowser CefWebBrowser { get; private set; }
private BuyerLoginInfo buyer = null;
private List<ShopCompany> lstShopCompany = new List<ShopCompany>();
private string currentUrl = "";
private volatile bool _isWindowLoaded = false;
#region 界面绑定属性
/// <summary>用户名</summary>
public string UserName
{
get { return this.GetValue(x => x.UserName); }
set { this.SetValue(x => x.UserName, value); }
}
/// <summary>密码</summary>
public string PassWord
{
get { return this.GetValue(x => x.PassWord); }
set { this.SetValue(x => x.PassWord, value); }
}
/// <summary>地址栏</summary>
public string Address
{
get { return this.GetValue(x => x.Address); }
set { this.SetValue(x => x.Address, value); }
}
/// <summary>登录成功后关闭窗口</summary>
public bool IsCloseAfterLogin
{
get { return this.GetValue(x => x.IsCloseAfterLogin); }
set { this.SetValue(x => x.IsCloseAfterLogin, value); }
}
/// <summary>登录模式</summary>
public bool IsLoginMode
{
get { return this.GetValue(x => x.IsLoginMode); }
set { this.SetValue(x => x.IsLoginMode, value); }
}
#endregion
#region 命令
public ICommand ReloadCommand { get; }
public ICommand LoginAgainCommand { get; }
public ICommand StopCommand { get; }
public ICommand CopyUserNameCommand { get; }
public ICommand CopyPasswordCommand { get; }
#endregion
public TaobaoLoginViewModel(BuyerLoginInfo buyerInfo)
{
TaobaoLoginInstance = this;
buyer = buyerInfo;
UserName = buyerInfo?.buyer_name;
PassWord = ""; //DataOpenSSL.DecryptString(buyerInfo.Password);
IsCloseAfterLogin = true;
IsLoginMode = OpenType == EnumOpenType.login;
ReloadCommand = new DelegateCommand(Reload);
LoginAgainCommand = new DelegateCommand(LoginAgain);
StopCommand = new DelegateCommand(StopButton);
CopyUserNameCommand = new DelegateCommand(CopyUserName);
CopyPasswordCommand = new DelegateCommand(CopyPassword);
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
IsLoginMode = OpenType == EnumOpenType.login;
_isWindowLoaded = true;
if (CloseAfterSecond > 0)
{
Task.Run(() =>
{
Thread.Sleep(1000 * CloseAfterSecond);
if (_isWindowLoaded)
{
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
if (_isWindowLoaded)
RequestClose?.Invoke();
}));
}
});
}
Task.Run(() =>
{
AutoLogin();
});
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
// 1. 解除 JS 绑定
CefWebBrowser?.JavascriptObjectRepository?.UnRegisterAll();
CefWebBrowser?.CloseDevTools();
// 2. 优雅关闭浏览器
CefWebBrowser?.GetBrowser()?.CloseBrowser(false);
// 3. 清理残留子进程(按路径判断,避免误杀)
CleanupBrowserSubprocesses(this.cefSubProcesses);
// 4. 释放控件
CefWebBrowser?.Dispose();
CefWebBrowser = null;
}
public int GetRenderProcessId()
{
int parentPid = Process.GetCurrentProcess().Id;
// 查找所有名为 CefSharp.BrowserSubprocess 且父进程为当前应用的进程
var subprocesses = Process.GetProcessesByName("CefSharp.BrowserSubprocess")
.Where(p =>
{
try
{
return p.SessionId == Process.GetCurrentProcess().SessionId && GetParentProcessId(p.Id) == parentPid;
}
catch { return false; }
});
// 返回第一个匹配的 Render 进程 ID,实际可能有多个
return subprocesses.FirstOrDefault()?.Id ?? -1;
}
// 辅助方法:获取父进程 ID (需引用 System.Management 或使用 P/Invoke)
private static int GetParentProcessId(int processId)
{
using (var query = new System.Management.ManagementObjectSearcher(
$"SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {processId}"))
{
using (var results = query.Get())
{
foreach (System.Management.ManagementObject obj in results)
{
return Convert.ToInt32(obj["ParentProcessId"]);
}
}
}
return -1;
}
public static void CleanupBrowserSubprocesses(List<Process> processes = null)
{
// 有可能释放错误导致程序崩溃,废弃
return;
try
{
if (processes == null)
processes = new List<Process>();
string appBasePath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\', '/');
Process[] subprocesses = Process.GetProcessesByName("CefSharp.BrowserSubprocess");
foreach (Process process in subprocesses)
{
bool shouldKill = false;
try
{
// 安全地获取进程模块信息,进程可能在我们检查时已退出
if (process != null && !process.HasExited)
{
string moduleFileName = process.MainModule?.FileName;
if (!string.IsNullOrEmpty(moduleFileName))
{
// 判断进程是否从当前应用目录启动
string processDir = System.IO.Path.GetDirectoryName(moduleFileName);
if (!string.IsNullOrEmpty(processDir) &&
(processDir.Equals(appBasePath, StringComparison.OrdinalIgnoreCase)
|| appBasePath.Contains(processDir) // 处理子目录情况
|| moduleFileName.Contains(appBasePath)))
{
if (!processes.Any(p => p.Handle.ParseToInt() == process.Handle.ParseToInt()))
shouldKill = true;
}
}
}
}
catch (InvalidOperationException)
{
// 进程可能在检查过程中已退出,忽略
continue;
}
catch (Win32Exception ex) when (ex.NativeErrorCode == 5) // 访问被拒绝
{
// 可能是权限问题或其他应用的进程,跳过
continue;
}
if (shouldKill)
{
try
{
process.Kill();
process.WaitForExit(500); // 等待最多500毫秒,确保进程终止
}
catch (Exception killEx)
{
// 记录日志,但通常进程已死
//System.Diagnostics.Debug.WriteLine($"终止进程时出错: {killEx.Message}");
}
}
}
}
catch (Exception ex)
{
// 这里最好不要用MessageBox,尤其是在关闭流程中,可能引发线程问题
// 建议记录到日志文件
//System.Diagnostics.Debug.WriteLine($"清理子进程时发生异常: {ex}");
}
}
/// <summary>
/// 自动登录店铺后台
/// </summary>
private async void AutoLogin()
{
if (OpenType != EnumOpenType.login && buyer == null)
return;
_ = Application.Current.Dispatcher.InvokeAsync(async () =>
{
if (CefWebBrowser == null)
{
this.cefSubProcesses = Process.GetProcessesByName("CefSharp.BrowserSubprocess").ToList();
if (!string.IsNullOrEmpty(InitUrl))
CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(InitUrl, false);
else
CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(buyerMainUrl, false);
LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler();
resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete;
resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad;
CefWebBrowser.RequestHandler = new LocalRequestHandler(resourceRequestHandler);
var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow);
CefWebBrowser.LifeSpanHandler = lifeSapnHandler;
//CefWebBrowser.KeyboardHandler = new KeyboardHandler();
CefWebBrowser.KeyboardHandler = new CefKeyboardHandler();
CefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
CefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
CefWebBrowser.LoadError += CefWebBrowser_LoadError;
// 通知视图把浏览器加入可视树(必须在等待浏览器初始化之前完成)
BrowserCreated?.Invoke(CefWebBrowser);
List<Cookie> cookieLst = new List<Cookie>();
try
{
if (buyer != null)
{
cookieLst = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(buyer?.cookie);
if (cookieLst == null)
cookieLst = new List<Cookie>();
}
}
catch
{
}
// cef138必须init后方可设置或删除cookie
while (_isWindowLoaded && (!CefWebBrowser.IsBrowserInitialized || !CefWebBrowser.GetBrowser().MainFrame.IsValid))
await Task.Delay(20);
//await WPFCEFBrowser.DeleteCookieAsync(CefWebBrowser.GetCookieManager(null));
//cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager
//await WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), CefWebBrowser.GetCookieManager(null));
if (OpenType != EnumOpenType.login)
{
foreach (var cook in cookieLst)
{
if (_isWindowLoaded)
await WPFCEFBrowser.SetCookieAsync(cook.Domain.Trim('.'), cook.Name + "=" + cook.Value + ";", CefWebBrowser.GetCookieManager(null));
}
}
//根据登录的具体店铺设置local storage
if (!string.IsNullOrEmpty(buyer?.buyer_id))
{
//var storageJsCode = "window.localStorage.setItem('" + "mall-info-id" + "', '" + shop.ShopId + "');\r\n";
//storageJsCode += "window.localStorage.setItem('" + "agentseller-mall-info-id" + "', '" + shop.ShopId + "');\r\n";
//while (!CefWebBrowser.IsBrowserInitialized || !CefWebBrowser.GetBrowser().MainFrame.IsValid)
// Thread.Sleep(20);
//CefWebBrowser.GetBrowser().MainFrame.ExecuteJavaScriptAsync(storageJsCode);
}
if (!string.IsNullOrEmpty(InitUrl))
CefWebBrowser?.Load(InitUrl);
else
CefWebBrowser?.Load(buyerMainUrl);
//不是登录的话就此返回
if (OpenType != EnumOpenType.login)
{
return;
}
for (int i = 0; i < 50; i++)
{
if (CefWebBrowser?.IsLoading == true)
await Task.Delay(100);
}
await Task.Delay(Randomx.GetId(1500, 2000));
if (!_isWindowLoaded)
return;
while (!CefWebBrowser?.Address?.StartsWith(buyerLoginUrl) ?? false)
{
await Task.Delay(1000);
if (!_isWindowLoaded)
return;
}
}
});
}
private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e)
{
}
private void CefWebBrowser_AddressChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (Application.Current?.Dispatcher != null)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
currentUrl = e.NewValue.ParseToString();
Address = e.NewValue.ParseToString();
}));
}
}
private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
//js绑定C#对象 html页面内声明绑定的C#对象
StringBuilder sb = new StringBuilder();
sb.Append("(function(){");
sb.Append("CefSharp.BindObjectAsync('shopObj');");
sb.Append("})();");
CefWebBrowser?.GetBrowser().MainFrame.EvaluateScriptAsync(sb.ToString());
}
private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request)
{
return false;
}
private async void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
{
await DoResourceLoadComplete(url, responseData);
}
private async Task DoResourceLoadComplete(string url, string responseData)
{
//if (url.Contains(buyerLoginUrl) && OpenType == EnumOpenType.login)
//{
// Task.Run(() => { CefWebBrowser.Load(buyerLoginUrl); });
//}
var data = responseData;
//if (data.Contains("karl_malone_32") || data.Contains("jtt_fan"))
{
//https://h5api.m.taobao.com/h5/mtop.user.getusersimple/1.0/?jsv=2.7.2&appKey=12574478&t=1789984970076&sign=6bb7d3b5cd8bd3ab32bd97c1a0df1c0f&jsonpIncPrefix=tbnavnew&api=mtop.user.getUserSimple&v=1.0&dataType=json&type=originaljson&data=%7B%7D
//{"api":"mtop.user.getUserSimple","v":"1.0","ret":["SUCCESS::调用成功"],"data":{"nick":"jtt_fan","userNumId":440631048,"displayNick":"jtt_fan"}}
}
if (url.Contains(buyerMainUrl) || (data.Contains("\"displayNick\"") && data.Contains("\"nick\"") && data.Contains("\"userNumId\"")))
{
if (OpenType == EnumOpenType.login)
{
await Task.Run(async () =>
{
if (data.Contains("\"ret\":[\"SUCCESS::调用成功\"]"))
{
var uid = BaseRegex.GetStringJson(ref data, "userNumId");
var nickname = BaseRegex.GetStringJson(ref data, "displayNick");
var username = nickname;
if (!string.IsNullOrEmpty(nickname) && !string.IsNullOrEmpty(uid) && !isAddOrUpdateBuyer)
{
isAddOrUpdateBuyer = true;
try
{
AddOrUpdateBuyer(uid, username, nickname);
}
catch
{
}
isAddOrUpdateBuyer = false;
}
}
});
}
}
}
bool isAddOrUpdateBuyer = false;
void AddOrUpdateBuyer(string uid, string username, string nickname)
{
Thread.Sleep(2000);
if (!_isWindowLoaded)
return;
//List<Cookie> cookieList = WPFCEFBrowser.GetCookieList(shopCookieHead, CefWebBrowser.GetCookieManager(null));
List<Cookie> cookieList = WPFCEFBrowser.GetCookieList("", CefWebBrowser.GetCookieManager(null));
var buyerUrl = BaseClass.Build29WxObjString("user/add_taobao_buyer");
if (this.buyer == null || this.buyer.buyer_id != uid)
this.buyer = GlobalConfig.TaobaoBuyerLoginList.FirstOrDefault(b => b.buyer_id == uid);
if (this.buyer != null)
{
this.buyer.status = "在线";
this.buyer.user_name = username;
this.buyer.buyer_nick = nickname;
this.buyer.cookie = JsonHelper.SerializeObject(cookieList);
buyerUrl = BaseClass.Build29WxObjString("user/mdy_taobao_buyer");
}
var buyerData = UserLogin.GetSignaturex()
+ "&buyer_id=" + uid
+ "&buyer_name=" + username
+ "&buyer_nick=" + nickname;
var result = GetHtml.PostUtf8(buyerUrl, buyerData);
if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(buyerUrl, buyerData);
buyerUrl = BaseClass.Build29WxObjString("user/mdy_taobao_buyer_cookie");
buyerData = UserLogin.GetSignaturex()
+ "&buyer_id=" + uid
+ "&status=" + "在线"
+ "&cookie=" + GetHtml.UrlEncodeUtf8(JsonHelper.SerializeObject(cookieList));
result = GetHtml.PostUtf8(buyerUrl, buyerData);
if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(buyerUrl, buyerData);
Application.Current?.Dispatcher.Invoke(new Action(() =>
{
try
{
if (IsCloseAfterLogin)
RequestClose?.Invoke();
}
catch (Exception ex)
{ }
}));
}
private void StopButton()
{
}
private void CopyUserName()
{
if (!string.IsNullOrEmpty(UserName))
Clipboard.SetDataObject(UserName);
}
private void CopyPassword()
{
if (!string.IsNullOrEmpty(PassWord))
Clipboard.SetDataObject(PassWord);
}
private void Reload()
{
if (CefWebBrowser != null)
{
if (Address != "about:blank")
CefWebBrowser?.Load(Address);
else
CefWebBrowser?.Load(buyerMainUrl);
}
}
private void LoginAgain()
{
if (this.currentUrl != buyerLoginUrl)
this.CefWebBrowser?.Load(buyerLoginUrl);
}
#region 静态方法(检测/更新买手登录状态)
public static void CheckBuyerLogin(List<BuyerLoginInfo> checkBuyers, bool isShowProgress = true)
{
for (int i = 0; i < checkBuyers.Count; i++)
{
var buyer = GlobalConfig.TaobaoBuyerLoginList.FirstOrDefault(v => v.buyer_id == checkBuyers[i].buyer_id);
var buys = GlobalConfig.TaobaoBuyerLoginList.Where(v => v.buyer_id == checkBuyers[i].buyer_id).ToList();
if (buyer == null)
continue;
// 先从服务端取最新cookie
var url = BaseClass.Build29WxObjString("user/get_taobao_buyer");
var data = UserLogin.GetSignaturex();
data += "&buyer_ids=" + buyer.buyer_id;
data += "&page_size=1";
var result = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(url, data);
if (!result.Contains("\"code\":200"))
continue;
List<BuyerLoginInfo> loginInfoLst = JsonHelper.DeserializeJsonToList<BuyerLoginInfo>(JsonHelper.JObjectParse(result)["data"].ParseToString());
var serverBuyer = loginInfoLst.FirstOrDefault();
if (buyer != null && serverBuyer != null)
{
buyer.cookie = serverBuyer.cookie;
foreach (var buy in buys)
{
buy.cookie = serverBuyer.cookie;
}
}
if (buyer != null)
{
return;
var loginResult = CheckBuyerLogin(buyer);
if (!loginResult.Contains("\"success\":true") && !loginResult.Contains("\"login\":true") && !loginResult.Contains("\"nickname\""))
{
buyer.cookie = "[]";
foreach (var buy in buys)
{
buy.status = "掉线";
buy.cookie = "[]";
}
}
else
{
foreach (var buy in buys)
{
buy.status = "在线";
}
}
UpdateServerBuyerCookies(buyer); // 店铺cookie和状态写入服务端
}
}
}
public static string CheckBuyerLogin(BuyerLoginInfo buyer, string refere = "https://mobile.yangkeduo.com/goods.html")
{
string url = "https://mobile.yangkeduo.com/proxy/api/api/apollo/v3/user/me?pdduid=" + buyer.buyer_id;
return HttpResponseYkdBLL.YangkeduoGetResponse(buyer, url, refere);
}
public static string UpdateServerBuyerCookies(BuyerLoginInfo buyer, string fromTool = null)
{
var url = BaseClass.Build29WxObjString("user/mdy_taobao_buyer_cookie");
var data = UserLogin.GetSignaturex()
+ "&status=" + buyer.status
+ "&cookie=" + GetHtml.UrlEncodeUtf8(buyer.cookie)
+ "&buyer_id=" + buyer.buyer_id;
var result = GetHtml.PostUtf8(url, data);
if (!result.Contains("\"code\":200"))
result = GetHtml.PostUtf8(url, data);
return result;
}
/// <summary>
/// 设置淘宝店铺掉线
/// </summary>
/// <param name="buyer"></param>
/// <param name="fromTool"></param>
/// <returns></returns>
public static string UpdateServerBuyerDisconnect(BuyerLoginInfo buyer, string fromTool = null)
{
//buyer.status = "掉线";
//buyer.cookie = "[]";
//var url = BaseClass.Build29WxObjString("user/mdy_taobao_buyer_cookie");
//var data = UserLogin.GetSignaturex()
// + "&status=" + "掉线"
// + "&cookie=" + "[]"
// + "&buyer_id=" + buyer.buyer_id;
//var result = GetHtml.PostUtf8(url, data);
//if (!result.Contains("\"code\":200"))
// result = GetHtml.PostUtf8(url, data);
//return result;
return "";
}
#endregion
}
internal class CefKeyboardHandler : IKeyboardHandler
{
public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
{
if (type == KeyType.KeyUp && Enum.IsDefined(typeof(System.Windows.Forms.Keys), windowsKeyCode))
{
var key = (System.Windows.Forms.Keys)windowsKeyCode;
switch (key)
{
case System.Windows.Forms.Keys.F12:
browser.ShowDevTools();
break;
case System.Windows.Forms.Keys.F5:
if (modifiers == CefEventFlags.ControlDown)
{
//MessageBox.Show("ctrl+f5");
browser.Reload(true); //强制忽略缓存
}
else
{
//MessageBox.Show("f5");
browser.Reload();
}
break;
}
}
return false;
}
public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
return false;
}
}
}
@@ -0,0 +1,181 @@
using _29WxOrderWpf.BaseWindows;
using WxOrder.Framework.Commons;
using _29WxOrderWpf.Ctrls.OrderCtrls;
using AllBase;
using AllBase.Helper;
using AllBase.Model.Config;
using AllBase.Model.DBModel;
using AllBase.Model.MvvmBaseClasses;
using AllBase.Model.Result;
using NaiBa.Util.Extension;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
using Work;
using Work._29Tools.BLL;
using Work._29Tools.Forms.ShopForms;
namespace _29WxOrderWpf.ViewModels
{
/// <summary>
/// 更改运单号ViewModel
/// </summary>
public class TransitExtraPackagesViewModel : PropertyNotifyObject
{
public oms_wei_order_info Order
{
get { return this.GetValue(x => x.Order); }
set { this.SetValue(x => x.Order, value); }
}
public oms_wei_order_item_info OrderItem
{
get { return this.GetValue(x => x.OrderItem); }
set { this.SetValue(x => x.OrderItem, value); }
}
public oms_wei_external_procurement_log_info TransitOrder
{
get { return this.GetValue(x => x.TransitOrder); }
set { this.SetValue(x => x.TransitOrder, value); }
}
public string purchaserNote
{
get { return this.GetValue(x => x.purchaserNote); }
set { this.SetValue(x => x.purchaserNote, value); }
}
public string WaybillId
{
get { return this.GetValue(x => x.WaybillId); }
set { this.SetValue(x => x.WaybillId, value); }
}
public bool IsChangeingWaybill
{
get { return this.GetValue(x => x.IsChangeingWaybill); }
set { this.SetValue(x => x.IsChangeingWaybill, value); }
}
public bool ChangeWaybillSuccess
{
get { return this.GetValue(x => x.ChangeWaybillSuccess); }
set { this.SetValue(x => x.ChangeWaybillSuccess, value); }
}
/// <summary>
/// 请求关闭窗口
/// </summary>
public event Action RequestClose;
#region 命令
public ICommand AddExtraPackagesCommand { get; }
#endregion
private volatile bool _isWindowLoaded = false;
public TransitExtraPackagesViewModel(oms_wei_order_info _order, oms_wei_order_item_info _orderItem)
{
Order = _order;
OrderItem = _orderItem;
AddExtraPackagesCommand = new DelegateCommand(AddExtraPackages);
}
/// <summary>
/// 窗口加载完成时调用
/// </summary>
public void Start()
{
_isWindowLoaded = true;
}
/// <summary>
/// 窗口关闭时调用,停止后台任务
/// </summary>
public void Stop()
{
_isWindowLoaded = false;
}
public void AddExtraPackages()
{
if (TransitOrder == null)
{
//TransitOrder = OrderItem.ItemTransitOrder ?? OrderItem.ItemTransitOrderWithVoid;
BaseMsgWindow.ShowError("未找到云仓发货包裹,请确认包裹存在");
return;
}
var transitExtraOrder = OrderItem.ItemTransitExtraOrders.FirstOrDefault(t => t.order_void_status != 1);
if (transitExtraOrder != null)
{
BaseMsgWindow.ShowError("有尚未作废的补发订单,请作废后再创建");
return;
}
string basePostageKey = WarehousePostageInfo.DicWarehousePostage.Keys.FirstOrDefault(pk => (OrderItem.ItemOrder?.province_name).ParseToString().Contains(pk));
decimal basePostage = basePostageKey.IsNullOrEmpty() ? WarehousePostageInfo.DicWarehousePostage.Values.Min() : WarehousePostageInfo.DicWarehousePostage[basePostageKey];
JObject body = new JObject();
body["oemAmount"] = (BaseClass.PostagePerOrderDiff * 100).ParseToInt().ParseToString();
body["postage"] = ((basePostage + BaseClass.PostagePerOrderDiff) * 100).ParseToInt().ParseToString();
body["packType"] = "2";
body["batchId"] = TransitOrder.order_code + "-" + ((OrderItem.ItemTransitExtraOrders?.Count).ParseToInt() + 1);
body["orderNo"] = OrderItem.order_id;
body["orderCode"] = TransitOrder.order_code;
// 未出库填上游物流,已出库填下游物流
if (TransitOrder.warehouse_status != 2)
{
body["logisticsCode"] = TransitOrder.express_1_company;
body["logisticsExpressCode"] = TransitOrder.express_1_waybill;
}
else
{
body["logisticsCode"] = TransitOrder.express_2_company;
body["logisticsExpressCode"] = TransitOrder.express_2_waybill;
}
body["accountUser"] = BaseClass.UserName;
body["purchaserNote"] = purchaserNote.ParseToString(); // 采购人备注
body["orderPlatformCode"] = "WEISHOP";
var url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/extra-packages/save";
var dataStr = JsonHelper.SerializeObject(body);
//<AjaxResult><msg>parentOrderCode不能为空</msg><code>2</code></AjaxResult>
//<AjaxResult><msg>创建额外包裹异常: Cannot invoke "cn.qihangerp.oms.domain.SecondUser.getBalance()" because "secondUser" is null</msg><code>2</code></AjaxResult>
var rst = HttpResponseWXBLL.e57PostResponse(url, dataStr, "");
//3739278903964250368
// <AjaxResult><msg>创建额外包裹异常: 用户账户余额不足,需至少 2.20 元用于中转仓取号, userId:17333276316, balance:0.85</msg><code>2</code></AjaxResult>
if (BaseRegex.GetStringXml(ref rst, "code") != "0" && BaseRegex.GetStringXml(ref rst, "code") != "200")
{
BaseMsgWindow.ShowError("服务端返回:" + BaseRegex.GetStringXml(ref rst, "msg"));
return;
}
var data = new JObject();
data["batchId"] = body["batchId"];
data["orderCode"] = body["orderCode"];
dataStr = JsonHelper.SerializeObject(data);
url = "https://po.e57.cn/prod-api/api/oms-api/external_procurement/thirdparty/extraPackages";
rst = HttpResponseWXBLL.e57PostResponse(url, dataStr, "");
// <AjaxResult><msg>额外信息已保存</msg><code>200</code></AjaxResult>
if (BaseRegex.GetStringXml(ref rst, "code") != "0" && BaseRegex.GetStringXml(ref rst, "code") != "200")
{
BaseMsgWindow.ShowError("服务端返回:" + BaseRegex.GetStringXml(ref rst, "msg"));
return;
}
Task.Run(() =>
{
StartUp.UpdateBalance();
MainWindow.Instance.orderListCtrl.GetOrder(OrderItem.order_id);
});
RequestClose?.Invoke();
}
}
}
@@ -0,0 +1,136 @@
<UserControl
x:Class="_29WxOrderWpf.Views.AutoBuyIntroductionView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:UserControls="clr-namespace:_29WxOrderWpf.UserControls"
xmlns:comn="WxOrder.Framework"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="AutoBuyInstructionView"
Width="800"
Height="450"
comn:DialogWindowProperty.ResizeMode="CanResizeWithGrip"
comn:DialogWindowProperty.ShowMinButton="False"
d:DesignHeight="450"
d:DesignWidth="800"
Loaded="AutoBuyInstructionView_Loaded"
mc:Ignorable="d">
<Grid Background="White">
<TextBlock
Margin="70,83,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="请输入支付宝支付密码:"
TextWrapping="Wrap" />
<PasswordBox
x:Name="pbxPassWord"
Width="169"
Height="24"
Margin="198,79,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
VerticalContentAlignment="Center"
PasswordChanged="pbxPassWord_PasswordChanged" />
<TextBox
x:Name="txtPassWord"
Width="149"
Height="24"
Margin="198,79,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
VerticalContentAlignment="Center"
d:IsHitTestVisible="True"
d:Opacity="0.3"
d:Text="明文密码"
d:Visibility="Visible"
BorderBrush="Transparent"
IsHitTestVisible="True"
TextChanged="txtPassWord_TextChanged"
Visibility="Collapsed" />
<Button
x:Name="btnSee"
Width="18"
Height="18"
Margin="347,82,0,0"
Padding="0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Background="Transparent"
BorderBrush="Transparent"
Click="btnSee_Click"
Content="👁"
Cursor="Hand"
Foreground="{StaticResource PageLinkBrush}" />
<Button
x:Name="btnSaveAliPass"
Width="Auto"
Height="22"
MinWidth="48"
Margin="372,80,0,0"
Padding="4,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="btnSaveAliPass_Click"
Content="保存密码"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}"
Visibility="Visible" />
<Button
x:Name="btnClear"
Width="Auto"
Height="22"
MinWidth="48"
Margin="433,80,0,0"
Padding="4,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="btnClear_Click"
Content="清空密码"
FontSize="12"
Style="{StaticResource BasePageButtonLightStyle}"
Visibility="Visible" />
<WrapPanel Margin="70,120,70,70" VerticalAlignment="Top">
<CheckBox
x:Name="chkMinProfitAutoBuy"
Margin="2,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
BorderBrush="{StaticResource mainColorBrush}"
Click="chkMinProfitAutoBuy_Click"
Content="当利润低于如下金额时跳过自动拍单:"
FontSize="12" />
<TextBox
x:Name="txtMinProfitAutoBuy"
Width="54"
Height="22"
HorizontalAlignment="Left"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
d:Text="0.0"
d:Visibility="Visible"
TextChanged="txtMinProfitAutoBuy_TextChanged" />
<TextBlock Margin="3,0,0,0" VerticalAlignment="Center">
元
</TextBlock>
<Button
x:Name="btnSaveMinProfitAutoBuy"
Width="Auto"
Height="22"
MinWidth="48"
Margin="5,0"
Padding="4,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="btnSaveMinProfitAutoBuy_Click"
Content="确定修改"
FontSize="12"
Style="{StaticResource BasePageButtonStyle}"
Visibility="Visible" />
</WrapPanel>
<TextBlock Margin="70,160,70,70" TextWrapping="Wrap"><Run Text="说明:" /><Run Text="自动拍单支持已创建sku关联的商品" /><Run Language="zh-cn" Text="。" /><LineBreak /><Run Text=" " /><Run Text="请保存支付宝支付密码(仅记录在本地)供自动拍单支付,首次自动拍单前请手动拍单一次以缓存支付宝Cookie。" /></TextBlock>
</Grid>
</UserControl>
@@ -0,0 +1,95 @@
using _29WxOrderWpf.BaseWindows;
using AllBase.Helper;
using AllBase.Model.DBModel;
using NaiBa.Util;
using NaiBa.Util.Extension;
using NaiBa.Util.Helper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Work.Pinduoduo;
namespace _29WxOrderWpf.Views
{
/// <summary>
/// AutoBuyInstructionView_.xaml 的交互逻辑
/// </summary>
public partial class AutoBuyIntroductionView : UserControl
{
public AutoBuyIntroductionView()
{
InitializeComponent();
}
private void AutoBuyInstructionView_Loaded(object sender, RoutedEventArgs e)
{
this.pbxPassWord.Password = DataOpenSSL.DecryptString(GlobalConfig.AutoBuyConfig.AlipayPassword);
this.chkMinProfitAutoBuy.IsChecked = GlobalConfig.AutoBuyConfig.IsLimitMinProfit;
this.txtMinProfitAutoBuy.Text = "" + GlobalConfig.AutoBuyConfig.MinProfit * 0.01m;
}
private void btnSaveAliPass_Click(object sender, RoutedEventArgs e)
{
GlobalConfig.AutoBuyConfig.AlipayPassword = DataOpenSSL.EncryptString(this.pbxPassWord.Password);
ConfigHelper.SaveConfig("auto_buy_config", GlobalConfig.AutoBuyConfig);
BaseMsgWindow.ShowInfo("密码保存成功!");
}
private void btnClear_Click(object sender, RoutedEventArgs e)
{
this.pbxPassWord.Password = "";
GlobalConfig.AutoBuyConfig.AlipayPassword = "";
ConfigHelper.SaveConfig("auto_buy_config", GlobalConfig.AutoBuyConfig);
BaseMsgWindow.ShowInfo("密码已清除!");
}
private void btnSee_Click(object sender, RoutedEventArgs e)
{
if (txtPassWord.Visibility == Visibility.Visible)
txtPassWord.Visibility = Visibility.Collapsed;
else
txtPassWord.Visibility = Visibility.Visible;
}
private void pbxPassWord_PasswordChanged(object sender, RoutedEventArgs e)
{
if (txtPassWord.Text != pbxPassWord.Password)
txtPassWord.Text = pbxPassWord.Password;
}
private void txtPassWord_TextChanged(object sender, TextChangedEventArgs e)
{
if (txtPassWord.Text != pbxPassWord.Password)
pbxPassWord.Password = txtPassWord.Text;
}
private void txtMinProfitAutoBuy_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void chkMinProfitAutoBuy_Click(object sender, RoutedEventArgs e)
{
}
private void btnSaveMinProfitAutoBuy_Click(object sender, RoutedEventArgs e)
{
GlobalConfig.AutoBuyConfig.IsLimitMinProfit = chkMinProfitAutoBuy.IsChecked ?? false;
GlobalConfig.AutoBuyConfig.MinProfit = (txtMinProfitAutoBuy.Text.ParseToDecimal() * 100).ParseToInt();
ConfigHelper.SaveConfig("auto_buy_config", GlobalConfig.AutoBuyConfig);
BaseMsgWindow.ShowInfo("自动拍单最低利润配置成功!");
}
}
}
@@ -0,0 +1,110 @@
<UserControl
x:Class="_29WxOrderWpf.Views.BaiduGetWaybillInfoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:basewindows="clr-namespace:_29WxOrderWpf.BaseWindows"
xmlns:comn="WxOrder.Framework"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wpf="WPFCommon"
x:Name="baiduGetWaybillInfoView"
Width="1200"
Height="600"
MinWidth="800"
MinHeight="600"
comn:DialogWindowProperty.ResizeMode="CanResizeWithGrip"
comn:DialogWindowProperty.ShowMinButton="False"
comn:DialogWindowProperty.Width="1200"
Loaded="BaiduGetWaybillInfoView_Loaded"
mc:Ignorable="d">
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
</UserControl.Resources>
<Grid Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="28" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Height="420" VerticalAlignment="Center">
<Image
x:Name="imgLoading"
Width="20"
Height="20"
Margin="10"
HorizontalAlignment="Left"
IsEnabled="False"
Source="{StaticResource imgLoadingPic}"
Visibility="{Binding IsLoading, Converter={StaticResource visibleToVisibilityConverter}}">
<Image.RenderTransform>
<RotateTransform Angle="45" CenterX="10" CenterY="10" />
</Image.RenderTransform>
<Image.Triggers>
<EventTrigger RoutedEvent="Image.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
RepeatBehavior="Forever"
Storyboard.TargetName="imgLoading"
Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"
From="0"
To="360"
Duration="0:0:3" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Image.Triggers>
</Image>
<TextBlock
Margin="50,0"
VerticalAlignment="Center"
FontSize="18"
Text="{Binding LatestWaybillStr}"
TextWrapping="Wrap" />
</Grid>
<GridSplitter
Grid.Row="1"
Height="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#d0d0d0"
ResizeBehavior="PreviousAndNext"
ShowsPreview="True" />
<!-- 地址栏 -->
<Border
Grid.Row="2"
Background="White"
BorderBrush="#E0E0E0"
BorderThickness="0,0,0,1">
<TextBox
x:Name="txtAddress"
Margin="3,2"
VerticalContentAlignment="Center"
BorderBrush="#D0D0D0"
BorderThickness="1"
KeyDown="txtAddress_KeyDown"
Text="{Binding Address, UpdateSourceTrigger=PropertyChanged}" />
</Border>
<!-- 主区域:浏览器 + 右侧面板 -->
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- 浏览器容器 -->
<Grid
x:Name="BrowserHost"
Grid.Column="0"
Background="White"
ClipToBounds="True" />
</Grid>
</Grid>
</UserControl>
@@ -0,0 +1,63 @@
using _29WxOrderWpf.BaseWindows;
using _29WxOrderWpf.ViewModels;
using AllBase.Model.DBModel;
using CefSharp.Wpf;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace _29WxOrderWpf.Views
{
/// <summary>
/// 百度获取物流信息窗口
/// </summary>
public partial class BaiduGetWaybillInfoView : UserControl
{
/// <summary>视图模型</summary>
public BaiduGetWaybillInfoViewModel ViewModel { get; }
public BaiduGetWaybillInfoView(oms_wei_order_item_info orderItem)
{
InitializeComponent();
ViewModel = new BaiduGetWaybillInfoViewModel(orderItem);
ViewModel.BrowserCreated += ViewModel_BrowserCreated;
ViewModel.RequestClose += ViewModel_RequestClose;
DataContext = ViewModel;
}
private async void BaiduGetWaybillInfoView_Loaded(object sender, RoutedEventArgs e)
{
ViewModel.Start();
}
private void BaiduGetWaybillInfoView_Closed(object sender, System.EventArgs e)
{
ViewModel.Stop();
}
private void ViewModel_BrowserCreated(ChromiumWebBrowser browser)
{
Grid.SetRow(browser, 0);
Grid.SetColumn(browser, 0);
BrowserHost.Children.Add(browser);
}
private void ViewModel_RequestClose()
{
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
parentWindow.Close();
}
private void txtAddress_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
ViewModel.ReloadCommand.Execute(null);
}
}
}
}
+84
View File
@@ -0,0 +1,84 @@
<UserControl
x:Class="_29WxOrderWpf.Views.ChangePickNoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="changePickNoView"
Width="450"
Height="300"
d:DesignHeight="300"
d:DesignWidth="450"
Loaded="ChangeWaybillView_Loaded"
mc:Ignorable="d">
<Grid Background="White">
<StackPanel Margin="24,24,24,0">
<TextBlock
Margin="0,0,0,20"
HorizontalAlignment="Center"
FontSize="15"
Foreground="#333333"
Text="添加/更改取件码" />
<StackPanel>
<TextBlock
Margin="0,0,0,8"
Foreground="#555555"
Text="填写取件码:" />
<TextBox
x:Name="txtPickNo"
Height="38"
VerticalContentAlignment="Center"
d:Text="1111"
BorderBrush="#D0D0D0"
BorderThickness="1"
FontSize="18"
Text="{Binding PickNo, UpdateSourceTrigger=PropertyChanged}"
VerticalScrollBarVisibility="Auto" />
<WrapPanel Margin="0,10,0,0" FlowDirection="RightToLeft">
<Button
Width="72"
Height="26"
Margin="0,0,10,0"
HorizontalAlignment="Right"
Click="Button_Click_1"
Command="{Binding ChangePickNoCommand}"
Content="修改取件码"
Style="{StaticResource BasePageButtonStyle}" />
<Image
x:Name="imgLoading"
Width="20"
Height="20"
IsEnabled="False"
Source="{StaticResource imgLoadingPic}"
Visibility="{Binding IsChangeingPickNo, Converter={StaticResource visibleToVisibilityConverter}}">
<Image.RenderTransform>
<RotateTransform Angle="45" CenterX="10" CenterY="10" />
</Image.RenderTransform>
<Image.Triggers>
<EventTrigger RoutedEvent="Image.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
RepeatBehavior="Forever"
Storyboard.TargetName="imgLoading"
Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"
From="360"
To="0"
Duration="0:0:3" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Image.Triggers>
</Image>
</WrapPanel>
<TextBlock
d:Text="如有需要,显示消息"
Text=""
TextWrapping="Wrap" />
</StackPanel>
</StackPanel>
</Grid>
</UserControl>
@@ -0,0 +1,63 @@
using _29WxOrderWpf.ViewModels;
using AllBase.Helper;
using AllBase.Model.DBModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace _29WxOrderWpf.Views;
/// <summary>
/// ChangeWaybillView.xaml 的交互逻辑
/// </summary>
public partial class ChangePickNoView : UserControl
{
/// <summary>
/// 视图模型
/// </summary>
public ChangePickNoViewModel ViewModel { get; }
public ChangePickNoView(oms_wei_order_item_info _orderItem)
{
InitializeComponent();
ViewModel = new ChangePickNoViewModel(_orderItem);
ViewModel.RequestClose += ViewModel_RequestClose;
DataContext = ViewModel;
}
private void ChangeWaybillView_Loaded(object sender, RoutedEventArgs e)
{
ViewModel.Start();
}
private void ChangeWaybillView_Closed(object sender, RoutedEventArgs e)
{
ViewModel.Stop();
}
private void ViewModel_RequestClose()
{
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
parentWindow.Close();
MainWindow.Instance.orderListCtrl.FilterOneOrder(ViewModel.OrderItem.ItemOrder);
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
}
}
+132
View File
@@ -0,0 +1,132 @@
<UserControl
x:Class="_29WxOrderWpf.Views.ChangeWaybillView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="ChangeWaybillCtrl"
Width="450"
Height="350"
d:DesignHeight="350"
d:DesignWidth="450"
Loaded="ChangeWaybillView_Loaded"
mc:Ignorable="d">
<Grid Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Image
x:Name="imgLoading"
Width="20"
Height="20"
Margin="0,30,30,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
IsEnabled="False"
Source="{StaticResource imgLoadingPic}"
Visibility="{Binding IsChangeingWaybill, Converter={StaticResource visibleToVisibilityConverter}}">
<Image.RenderTransform>
<RotateTransform Angle="45" CenterX="10" CenterY="10" />
</Image.RenderTransform>
<Image.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
RepeatBehavior="Forever"
Storyboard.TargetName="imgLoading"
Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"
From="360"
To="0"
Duration="0:0:3" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Image.Triggers>
</Image>
<StackPanel Margin="24,24,24,0">
<TextBlock
Margin="0,0,0,10"
HorizontalAlignment="Center"
FontSize="15"
Foreground="#333333"
Text="更改运单号" />
<StackPanel>
<TextBlock
Margin="0,0,0,8"
Foreground="#555555"
Text="填写运单号:" />
<TextBox
x:Name="txtWaybillId"
Height="38"
VerticalContentAlignment="Center"
d:Text="1111"
BorderBrush="#D0D0D0"
BorderThickness="1"
FontSize="18"
Text="{Binding WaybillId, UpdateSourceTrigger=PropertyChanged}"
VerticalScrollBarVisibility="Auto" />
<WrapPanel Margin="0,10,0,0" FlowDirection="RightToLeft">
<Button
Width="64"
Height="26"
Margin="0,0,10,0"
HorizontalAlignment="Right"
Command="{Binding ChangeWaybillCommand}"
Content="确定更改"
Style="{StaticResource BasePageButtonStyle}" />
</WrapPanel>
</StackPanel>
</StackPanel>
<StackPanel Grid.Row="1" Margin="24,24,24,0">
<TextBlock
Margin="0,0,0,10"
HorizontalAlignment="Center"
FontSize="15"
Foreground="#333333"
Text="订单补寄" />
<StackPanel>
<TextBlock
Margin="0,0,0,8"
Foreground="#555555"
Text="填写补寄运单号:" />
<TextBox
x:Name="txtCompensationWaybillId"
Height="38"
VerticalContentAlignment="Center"
d:Text="1111"
BorderBrush="#D0D0D0"
BorderThickness="1"
FontSize="18"
Text="{Binding CompensationWaybillId, UpdateSourceTrigger=PropertyChanged}"
VerticalScrollBarVisibility="Auto" />
<WrapPanel Margin="0,10,0,0" FlowDirection="RightToLeft">
<Button
Width="64"
Height="26"
Margin="0,0,10,0"
HorizontalAlignment="Right"
Command="{Binding SendCompensationDeliveryCommand}"
Content="确定补寄"
Style="{StaticResource BasePageButtonStyle}" />
</WrapPanel>
<TextBlock
d:Text="textBlock"
Foreground="Red"
Text=""
TextWrapping="Wrap" />
</StackPanel>
</StackPanel>
</Grid>
</UserControl>
@@ -0,0 +1,68 @@
using _29WxOrderWpf.ViewModels;
using AllBase.Helper;
using AllBase.Model.DBModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace _29WxOrderWpf.Views;
/// <summary>
/// ChangeWaybillView.xaml 的交互逻辑
/// </summary>
public partial class ChangeWaybillView : UserControl
{
/// <summary>
/// 视图模型
/// </summary>
public ChangeWaybillViewModel ViewModel { get; }
public ChangeWaybillView(oms_wei_order_item_info _orderItem)
{
InitializeComponent();
ViewModel = new ChangeWaybillViewModel(_orderItem);
ViewModel.RequestClose += ViewModel_RequestClose;
DataContext = ViewModel;
}
private void ChangeWaybillView_Loaded(object sender, RoutedEventArgs e)
{
Window parentWindow = Window.GetWindow(this);
if (parentWindow != null)
{
parentWindow.Closed += ChangeWaybillView_Closed;
}
ViewModel.Start();
}
private void ChangeWaybillView_Closed(object sender, EventArgs e)
{
ViewModel.Stop();
}
private void ViewModel_RequestClose()
{
Window parentWindow = Window.GetWindow(this);
if (this.IsLoaded && parentWindow != null)
parentWindow.Close();
MainWindow.Instance.orderListCtrl.FilterOneOrder(ViewModel.OrderItem?.ItemOrder);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
}
}
@@ -0,0 +1,115 @@
<UserControl
x:Class="_29WxOrderWpf.Views.EWaybillPathListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Height="auto"
d:DesignHeight="80"
d:DesignWidth="600"
mc:Ignorable="d">
<Grid>
<Border
Margin="4"
BorderBrush="LightGray"
BorderThickness="0,0,0,1"
CornerRadius="0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<Image
x:Name="imgSku"
Grid.Row="0"
Grid.Column="0"
Width="20"
Height="20"
Margin="8"
Cursor="Hand"
MouseDown="imgSku_MouseDown"
MouseEnter="imgSku_MouseEnter"
MouseLeave="imgSku_MouseLeave" />
<Grid
Grid.Column="1"
Margin="0,8"
VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<WrapPanel Grid.Row="0" Visibility="{Binding node_desc, Converter={StaticResource HasTextVisibility}}">
<TextBox
VerticalAlignment="Top"
d:Opacity="0.5"
d:Visibility="Visible"
Background="Transparent"
BorderThickness="0"
FontWeight="Bold"
IsReadOnly="True"
Text="物流信息:"
TextWrapping="Wrap"
Visibility="Collapsed" />
<TextBox
Grid.Row="0"
VerticalAlignment="Top"
d:Opacity="0.5"
d:Text="已送达"
Background="Transparent"
BorderThickness="0"
FontWeight="Bold"
IsReadOnly="True"
Text="{Binding node_desc}"
TextWrapping="Wrap" />
</WrapPanel>
<WrapPanel Grid.Row="1" Visibility="{Binding UpdateTimeStr, Converter={StaticResource HasTextVisibility}}" Margin="4">
<TextBox
VerticalAlignment="Top"
d:Opacity="0.5"
d:Visibility="Visible"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="更新时间:"
TextWrapping="Wrap"
Visibility="Collapsed" />
<TextBox
Grid.Row="0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
d:Opacity="0.5"
d:Text="2000/1/1 0:0:0"
Background="Transparent"
BorderThickness="0"
IsReadOnly="True"
Text="{Binding UpdateTimeStr}"
TextWrapping="Wrap" />
</WrapPanel>
</Grid>
<Button
x:Name="btnAdd"
Grid.Column="100"
MinWidth="18"
MinHeight="28"
Margin="8"
Padding="4"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Content=""
Style="{StaticResource BasePageButtonStyle}"
Visibility="Hidden" />
</Grid>
</Border>
</Grid>
</UserControl>
@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace _29WxOrderWpf.Views;
/// <summary>
/// EWaybillPathListView.xaml 的交互逻辑
/// </summary>
public partial class EWaybillPathListView : UserControl
{
public EWaybillPathListView()
{
InitializeComponent();
}
private void imgSku_MouseDown(object sender, MouseButtonEventArgs e)
{
}
private void imgSku_MouseEnter(object sender, MouseEventArgs e)
{
}
private void imgSku_MouseLeave(object sender, MouseEventArgs e)
{
}
}
+138
View File
@@ -0,0 +1,138 @@
<UserControl
x:Class="_29WxOrderWpf.Views.EWaybillPathView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:_29WxOrderWpf.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="EWaybillPathCtrl"
d:DesignHeight="450"
d:DesignWidth="800" Loaded="EWaybillPathCtrl_Loaded"
Background="White"
mc:Ignorable="d">
<Grid Margin="24,24,24,24">
<WrapPanel
Margin="0,0,0,20"
HorizontalAlignment="Center"
VerticalAlignment="top">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Top"
FontSize="15"
Foreground="#333333"
Text="订单 " />
<TextBox
x:Name="txtOrderId"
VerticalContentAlignment="Center"
d:Text="1111111"
BorderBrush="#D0D0D0"
BorderThickness="0"
FontSize="14"
Text="{Binding OrderId, UpdateSourceTrigger=PropertyChanged}"
VerticalScrollBarVisibility="Auto" />
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Top"
FontSize="15"
Foreground="#333333"
Text=" 物流明细" />
</WrapPanel>
<Grid Margin="24,24,24,24">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Margin="24,24,24,24">
<Grid>
<WrapPanel>
<TextBlock FontSize="14" Text="物流公司:" />
<TextBox
x:Name="txtExpressName"
VerticalContentAlignment="Center"
d:Text="物流公司:"
BorderBrush="#D0D0D0"
BorderThickness="0"
FontSize="14"
Text="{Binding ExpressName, UpdateSourceTrigger=PropertyChanged}"
VerticalScrollBarVisibility="Auto" />
</WrapPanel>
<Image
x:Name="imgLoading"
Width="20"
Height="20"
HorizontalAlignment="Right"
IsEnabled="False"
Source="{StaticResource imgLoadingPic}"
Visibility="{Binding IsGetWaybillPath, Converter={StaticResource visibleToVisibilityConverter}}">
<Image.RenderTransform>
<RotateTransform Angle="45" CenterX="10" CenterY="10" />
</Image.RenderTransform>
<Image.Triggers>
<EventTrigger RoutedEvent="Image.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
RepeatBehavior="Forever"
Storyboard.TargetName="imgLoading"
Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"
From="0"
To="360"
Duration="0:0:3" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Image.Triggers>
</Image>
</Grid>
<WrapPanel>
<TextBlock FontSize="14" Text="物流编码:" />
<TextBox
x:Name="txtWaybillId"
VerticalContentAlignment="Center"
d:Text="物流编码:"
BorderBrush="#D0D0D0"
BorderThickness="0"
FontSize="14"
Text="{Binding WaybillId, UpdateSourceTrigger=PropertyChanged}"
VerticalScrollBarVisibility="Auto" />
</WrapPanel>
</StackPanel>
<ListBox
x:Name="lbxSku"
Grid.Row="1"
Grid.Column="1"
Margin="7,0,7,0"
HorizontalContentAlignment="Stretch"
BorderThickness="0"
ItemsSource="{Binding WaybillPathInfos}"
ScrollViewer.CanContentScroll="True"
VirtualizingPanel.ScrollUnit="Pixel">
<!-- 使用自定义属性模板去除ListBox高亮显示框 -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!-- 此处绑定将数据源传递给子自定义控件OrderListRowCtrl -->
<local:EWaybillPathListView
VerticalAlignment="Center"
VerticalContentAlignment="Center"
DataContext="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
</UserControl>
Loaded 100 of 268 files, more files were not shown because too many files have changed in this diff. Show more