Compare commits

...

994 Commits
master ... v1.0

Author SHA1 Message Date
Hex 1d0435c12c fix:推送标题合并备注 1 year ago
Yen 7176fe803f fix: 修复订单数量移除;修改核销支付参数;对接伟成sku同步接口 1 year ago
Yen a49c19eed0 fix: debug 1 year ago
Yen 195bb700c6 fix: debug 1 year ago
Yen d44e314290 fix: debug 1 year ago
Yen 9ffb7b254f fix: 下单异常提示,核销退回异常修复 1 year ago
Yen 0c1e10969f fix: spu界面模糊查询 1 year ago
Yen bbf2f15a17 fix: 修复审批结果异常; 1 year ago
Yen 28d63335fb fix: 修复回退补偿不生效 1 year ago
Yen ab3184af3a fix: 修复回退补偿不生效 1 year ago
Yen d7c7fa4270 opt: 修复回退补偿不生效 1 year ago
Yen f313f45256 fix: 添加thirty不再支付 1 year ago
Yen 107a73cdfb fix: 费用释放调整 1 year ago
Yen 02c9e560a3 fix: 重构退回,添加拼接v2版本 1 year ago
Yen 12bed77a6b opt: 重构退回,添加拼接v2版本 1 year ago
Yen 4e4d28b2e8 fix: 修复bir生成; 1 year ago
Yen fdf615b6ab fix: 修复bir生成 1 year ago
Yen d9c38d6f0d feat: 客户和商品添加线上线下 1 year ago
Yen 41aa579a9b fix: 修复不包含的商品查询 1 year ago
Yen 76102eee44 fix: 不包含的规则空指针 1 year ago
Yen df0695b0a9 feat:除了包含的规则,增加一个不包含的规则 1 year ago
Yen 45d7a98272 修复bir不同步 1 year ago
Yen 338e7aee77 调整 1 year ago
Yen 09f65eacd7 政策释放接口 1 year ago
Yen d49f80d662 修复CA数据;修复锦泰历史数据 1 year ago
Yen c9637ef8bd 取消支付代码 1 year ago
Yen ea50788737 兼容核销同步状态 1 year ago
Yen f6294107d3 核销调整;bir调整 1 year ago
Yen 0a8587e6ca 审批辅助显示修复;替换天翼云;客户查询调整 2 years ago
15989082884@163.com edea9cd167 删除了更新冗余字段,岗位用户表 2 years ago
15989082884@163.com 40f4b8a257 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 3527ab4c84 冗余字段,出现空指针,暂时注释了 2 years ago
Yen 6bc19f5e6e 添加政策审批后存货方式同步 2 years ago
Yen 1adcfee785 修复政策生成费用接口;sku和spu删除不受编码影响 2 years ago
Yen 9e71249c86 修复调度生成费用品类缺失 2 years ago
Yen cf831cee64 修复取消异动时,预算占用的异常 2 years ago
Yen dfecee8de2 客户支持supplierFlag=2 2 years ago
Yen d8dd9f9dd0 Log调整;添加申请后置补偿;伟成接口对接; 2 years ago
15989082884@163.com b629a3455e 转换编码 2 years ago
15989082884@163.com 4172631bb5 修复转换编码时,产品上下架 和可下单状态 的影响 2 years ago
15989082884@163.com 494bc82a71 第三方客户接口,添加和更新 2 years ago
15989082884@163.com ea58f91760 修复BUG 2 years ago
Yen edb811f000 政策占用补偿;重新指定费用申请生成bir;政策生成费用记录接口调整 2 years ago
Yen 3e0d607614 修复预算异常 2 years ago
Yen 3b2beec919 客户帐余调整;完善协议类申请跑新流程 2 years ago
Yen f0f7d290cf 调整 2 years ago
Yen 4bb7b591ad 订单查询调整,跨年预算禁用支持 2 years ago
Yen c30f86cd61 政策同步到伟成接口 2 years ago
Yen 1537c711a1 SKU客户价 2 years ago
Yen 62c96b1ecd 费用申请调整金额重写 2 years ago
Yen a01d8001c5 费率调整 2 years ago
Yen ca6f6f7714 调整 2 years ago
Yen 7fc6d002c7 预算使用情况 2 years ago
Yen 41c739ac43 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 26ba54c265 预算使用情况 2 years ago
15989082884@163.com e2f83cb40b 预算使用情况报表改BUG 2 years ago
Yen 6ea2187551 预算使用情况 2 years ago
Yen 8a46d96777 预算使用情况 2 years ago
Yen 470b12502d 关联成本中心 2 years ago
15989082884@163.com b8b0243420 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com ef1c93e85c 综合查询调整 2 years ago
Yen bf276d8c7d 调整 2 years ago
15989082884@163.com b42fcdd6d0 同步商品信息时,如果没有对应分类,创建分类 2 years ago
15989082884@163.com 94858a9635 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com c39a97bb71 添加费用综合查询接口 2 years ago
Yen c381d99ac0 debug 2 years ago
Yen e9829a9252 费率展示调整;客户添加大区;其它微小调整 2 years ago
Yen 270504a5dd 费用率展示修改 2 years ago
Yen 5bbcf7e456 活动与预算匹配 2 years ago
Yen 8a5ebc2506 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 0125950ec1 活动与预算匹配 2 years ago
15989082884@163.com c5c32aa16b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 7d0e4a546e 三表联查接口 2 years ago
Yen 5a40aa9d7b 调整 2 years ago
Yen b08c4db52b 协议条款关联OA流水号 2 years ago
Yen cb1fcfdeb5 查询周期使用情况 2 years ago
Yen 9635b814bb 移除日志平台代码 2 years ago
Yen e1b3c43bb6 核销调整;商品导入调整 2 years ago
Yen cd1f10b8a1 核销调整 2 years ago
Yen 11ae35ee35 核销调整 2 years ago
Yen 4733fb59e7 修复核销时centergoods不更新 2 years ago
Yen 0e89e52bc8 在SPU做统计 2 years ago
Yen ee16314cc4 区域添加唯一的系统编码 2 years ago
Yen 53462b232a sku列表查询调整 2 years ago
Yen a68cda6845 政策查询调整;订单调整 2 years ago
Yen 8ff6840271 政策查询调整 2 years ago
15989082884@163.com b98d9241a9 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com fabe6b74c5 生成costApply的申请时间不为null,补填 2 years ago
Yen fac2787ee1 调整订单查询;添加异动记录 2 years ago
Yen 4b1e22804b 历史发货单查询调整 2 years ago
15989082884@163.com 173d8b5c44 修复订单选品返回 特殊品字段 2 years ago
15989082884@163.com 7975eb7ab0 修复SKU查询BUG 2 years ago
Yen 0cfbf74bcf 特殊品查询 2 years ago
Yen 1189e09e1d 调整协议条款跳转;订单下单时间支持 2 years ago
Yen 559b919ede 审批金额分摊修复 2 years ago
Yen a9644f0fe0 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen c60d9db2df 审批金额分摊修复 2 years ago
15989082884@163.com 2004be8864 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 8dfe04407f BIR添加申请中状态 2 years ago
Yen ca68b9fd96 下单调整;活动发布调整 2 years ago
Yen 1fc15232cf 商品导入功能修复 2 years ago
Yen 3ad87647e8 调整金额异常修复 2 years ago
Yen d951d0ea1d 调整金额异常修复 2 years ago
Yen 0ec13333f0 添加移除费用(管理员debug),调整金额异常修复 2 years ago
Yen 9701b5f985 添加移除费用(管理员) 2 years ago
Yen 58c8aebce9 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 69b9960954 修复错误的Bir;网点导出异常修复;网点导入异常修复 2 years ago
15989082884@163.com 5c14742257 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com da23b7234d 政策一站创建接口中 VTB添加关联ID 2 years ago
Yen 4ba86f901c 修复错误的预算占用 2 years ago
15989082884@163.com c260129f07 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 5904a17824 bir删除 漏了判断list长度 2 years ago
Yen c66619af62 一站式创建费用(debug) 2 years ago
Yen 727e1f7746 一站式创建费用(debug) 2 years ago
Yen 1c8794398d 移除非审批和通过状态的bir 2 years ago
Yen b7851e2f44 移除无用TODO 2 years ago
Yen 6cd7904f0d debug 2 years ago
Yen 768baef0e9 debug 2 years ago
Yen 2534a97783 商品导入调整 2 years ago
Yen 8db929c837 商品导入调整 2 years ago
Yen 31bd3cc97d sku导入 2 years ago
Yen e84995e37f 成本中心维度核销,debug;sku导入 2 years ago
Yen ce48a76e47 成本中心维度核销,debug 2 years ago
Yen e77c409d31 成本中心维度核销,debug 2 years ago
Yen dafe2764a3 成本中心维度核销,debug 2 years ago
Yen 81650588c3 成本中心维度核销,debug 2 years ago
Yen 5d8280bcea 成本中心维度核销,订单系统微调 2 years ago
15989082884@163.com f8ead69c8b SQL 漏了orderFlag字段 2 years ago
Yen f9abfc3893 成本中心维度核销(审批完成回调) 2 years ago
Yen c3c2ce52d2 成本中心维度核销(审批完成回调) 2 years ago
Yen 8f5b56a073 成本中心维度核销(成本中心维度核销金额调整) 2 years ago
Yen 7dc6d96a9e 成本中心维度核销 2 years ago
Yen 2f12e010b5 成本中心维度核销 2 years ago
Yen af92bc21c9 政策同步到销路通 2 years ago
Yen 60604de92d 政策同步到销路通 2 years ago
Yen 7dd4beb019 部分核销状态查询修复 2 years ago
Yen 8d07689c6e 订单调整 2 years ago
Yen 70e9351819 订单调整 2 years ago
Yen daa8f74ab5 调整 2 years ago
Yen 3d0e0d4aba 订单商品过滤 2 years ago
Yen 50b09a21e9 同步Stand商品 2 years ago
Yen c104a4bb8c 获取费用申请相关的预算项使用合计 2 years ago
Yen af193a46d7 微调 2 years ago
Yen f17ea8046c 特定模板不支持政策修复;产品移除商城结构 2 years ago
Yen d3cd887eb3 订单调整 2 years ago
Yen c22fe42cf0 支付join维度查询 2 years ago
Yen 543961ef87 编辑渠道优惠政策子项界面显示该产品品牌 2 years ago
Yen 0e07845631 添加政策作废 2 years ago
Yen 68a6928563 支付连表查询 2 years ago
Yen b46908e610 预算使用导出 2 years ago
15989082884@163.com 9cccfc3412 模板查询条件 2 years ago
Yen 3c63ccce33 debug 2 years ago
Yen f04b126adf 最近两个月发货单spu查询 2 years ago
Yen f86142dd0e Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen c5a54236b9 支付外联查询 2 years ago
15989082884@163.com 65a3fef002 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 5dc6d9b7fb 一站式政策核销,创建费用,费用预算占用,核销,政策预算调减 2 years ago
Yen 361c799e18 兼容任务调度配置用于兼容负载均衡 2 years ago
Yen 5b5958df50 修复政策预算异常 2 years ago
Yen f2fa90f644 协议类;预算异常补偿 2 years ago
Yen d5a3e8b26b 微调查询;添加协议类支付核销 2 years ago
15989082884@163.com c3efb352a3 支付修改 2 years ago
Yen cda91ea6f2 立即下单;修复下单金额异常 2 years ago
Yen 16d6e45fc5 联合成本中心修改客户公司维度; 2 years ago
Yen b74b36cab2 支付调整;添加大区费率;添加客户公司维度费率; 2 years ago
Yen 622e51784f 更新支付状态 2 years ago
Yen 764b166a0e 订单调整;离职交接修复; 2 years ago
Yen f3e299fd22 订单调整 2 years ago
Yen 23d42a4d34 订单调整 2 years ago
15989082884@163.com 7606344375 客户成本中心合计发货金额有误,已调整 2 years ago
Yen 1d92585ff6 微调 2 years ago
Yen cb74975cec 活动品类按比例分割支付金额(待测试) 2 years ago
Yen ddb1d7f739 条款调整;活动关联支付数据 2 years ago
Yen d380a79a3e 已解冻的费用限制在三天内可核销,逾期自动 2 years ago
Yen d5b3d397a5 协议条款审批调整;退回的案设置三天内可核销; 2 years ago
Yen 33b6f45a29 商品字段调整;协议条款添加审批; 2 years ago
Yen 77047d6624 对接物流地址ID;费用申请审批附件显示异常;个人组异常修复 2 years ago
Yen 0306885b14 添加政策交接 2 years ago
Yen 3f3c5fa48e 交接功能修复 2 years ago
Yen a6785a87d0 费用核销数据交接 2 years ago
Yen 2fb2a9de48 订单调整;费用核销交接查询 2 years ago
15989082884@163.com 5fcf08792c 支付合计 2 years ago
15989082884@163.com d0b158fbd0 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com ede5987dfc 待支付合计 2 years ago
Yen e229d1b50c 加签支持附件;人员组微调 2 years ago
Yen 92559012ef 人员数据分组 2 years ago
Yen cc76ab12e3 人员数据分组 2 years ago
Yen bd63e81181 人员离职角色交接 2 years ago
Yen 815472a869 人员离职客户交接 2 years ago
Yen 631a0f9d87 错误日志异步自动修复;SPU导入导出 2 years ago
Yen 9c66ddc3ce 0元核销异常修复;bir_act脏数据修复; 2 years ago
Yen 81db2b1e53 修复tapd异常 2 years ago
15989082884@163.com d5f4a064b7 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com f272d470bf Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 410e56245e 活动金额 核销金额查询 添加返回ID 2 years ago
Yen f4ff938d23 订单调整;费率调整 2 years ago
Yen 3c4a02fc31 异常修复 2 years ago
Yen 1b8719a33a 迁移销路通订单数据源 2 years ago
Yen 7fee52a75a 审批调整;订单查询修复 2 years ago
Yen 913f8f2346 预算匹配debug调整 2 years ago
Yen 8665120530 核销debug调整 2 years ago
Yen 16660de391 对接调度系统,添加spu转sku相关 2 years ago
Yen 4d37333d39 添加预算指定活动模板;添加spu转sku 2 years ago
Yen 5eb850c5cb 添加预算指定活动模板 2 years ago
15989082884@163.com 97e7984c13 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 561ab63245 添加活动核销支付金额 查询 合计接口 2 years ago
Yen 02bcf3b469 客户档案调整;标签类目调整;数据中心调整 2 years ago
Yen a5a1f09253 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 983b1b7031 修复标签异常;添加拜访业务类型 2 years ago
15989082884@163.com cbd462551e Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 6b48bb713f 修改【费用申请活动支付金额管理 】 和 添加核销【余额不再支付】字段 2 years ago
Yen 6acb312f96 签到,拜访导出 2 years ago
Yen edc1f3be8f 兼容模板预算id过滤 2 years ago
Yen cef708ceed 修改预算匹配规则;订单调整 2 years ago
15989082884@163.com 22d916e8a1 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 99e433c3a5 支付接口微调 2 years ago
15989082884@163.com 15fc6e1b32 活动核销金额查询界面和导出 2 years ago
Yen 3a2440544e 订单、标签调整 2 years ago
Yen 22406073fd 订单调整 2 years ago
15989082884@163.com ce7486b3d8 调度系统 请求时,补上支付的创建人 2 years ago
Yen 63f6bdb2c4 调整 2 years ago
15989082884@163.com 0ebfdfab89 核销费用率异常 2 years ago
15989082884@163.com 6f8417b832 BIR 添加模糊搜索 2 years ago
15989082884@163.com fe22b96bf7 BIR表添加字段,模板ID和名称 2 years ago
15989082884@163.com 07987ab1fc Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 0867008aec 导出对帐单明细查询时间BUG 2 years ago
Yen 3294b44a2a 兼容销售区域 2 years ago
15989082884@163.com 075c9b22c5 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 6b91c2fb83 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 0310dad84e 客户费用,时间查询BUG 2 years ago
Yen 99896a37fa 数据中心调整 2 years ago
Yen 9641573716 下单流程调整 2 years ago
Yen c335038442 数据中心数据支持业务查询 2 years ago
Yen ef5fd66c91 数据中心添加管理员功能 2 years ago
Yen 4aae1adf62 数据中心添加业务数据 2 years ago
Yen 539903924a 现在PC端下单流程 2 years ago
Yen 518c71bd0c 调整 2 years ago
Yen 06a4beb855 调整 2 years ago
Yen dd32f4e3a3 离职移除客户负责人 2 years ago
Yen 00924fac83 销售计划 2 years ago
Yen 1ecba54635 销售计划 2 years ago
Yen 3dc40f7da6 销售计划 2 years ago
Yen 59d42fbc07 添加费用申请提示 2 years ago
15989082884@163.com 664f31cc91 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 3dcd1a9641 不再支付 添加余额不再支付 2 years ago
Yen 65f51ceef1 添加品牌规则 2 years ago
15989082884@163.com 69f4b11aec 不再支付接口 2 years ago
15989082884@163.com e171fda7bb Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 50c5b1a7e3 微调 修BUG 2 years ago
Yen 97741b30c5 申请信息提示配置 2 years ago
Yen 93aab3a28b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 15fe88bc1c debug 2 years ago
15989082884@163.com d72362075e 导出渠道 网点 2 years ago
15989082884@163.com 4da2986db6 支付检验 2 years ago
15989082884@163.com 5eff309e3e Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 0a4c54a2b0 渠道 网点 时间搜索 2 years ago
Yen 8eab918659 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen f97f890003 客户的成本中心维度费率 2 years ago
15989082884@163.com 5ffc37a032 渠道 网点 导出添加 条数限制 2 years ago
15989082884@163.com d92fb9370e 调度系统生成费用的接口 2 years ago
Yen 18557dcf76 核销到销路通替换为请求支付API 2 years ago
Yen d729cb816e 导出接口;编码区分测试数据;调整日志输出 2 years ago
15989082884@163.com 1c14e6ac6f 支付接口调整 2 years ago
15989082884@163.com 282341bff6 支付接口 2 years ago
15989082884@163.com 67dc42715e 保存核销时添加MainCode 2 years ago
15989082884@163.com 7106972df2 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 5f50f5e930 支付调整 ,核销和支付添加mainCode字段 2 years ago
Yen b941ef9c3b debug 2 years ago
Yen 71e265504f 费用申请,创建客户维度费率数据 2 years ago
Yen 84cb00b25e 修复查询异常 2 years ago
15989082884@163.com 2287701bf4 取消支付接口 2 years ago
15989082884@163.com 8ab914c5a4 支付接口 2 years ago
15989082884@163.com 57d7a9f04a Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 2353f4f051 支付接口 2 years ago
Yen 8f24e334ab 核销调度接口事务补偿 2 years ago
Yen deab7eb644 核销调度接口事务补偿 2 years ago
15989082884@163.com 032e1803fa 费用导出查询 2 years ago
15989082884@163.com 97070b2d13 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 9a6fef31d8 客户导入 2 years ago
Yen 3d4c9292ec 协议类拓展OA部门id 2 years ago
Yen bc381cccb7 调整购物车逻辑 2 years ago
Yen a97c6a3bd3 费用申请添加核销状态 2 years ago
15989082884@163.com fae9fa7368 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 96aabaa6d8 客户导出BUG 2 years ago
Yen 635bdcd1ff 对接调度系统,兼容旧用户编码 2 years ago
Yen 5272ae37aa Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen f1aacd97ce 对接调度系统 2 years ago
15989082884@163.com f131fad01d Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 1383201623 客户导入修BUG 2 years ago
Yen 4715a98793 客户帐余;客户特殊价;修复导入预算异步异常 2 years ago
Yen a6d9b28811 客户帐余;客户特殊价;修复导入预算异步异常 2 years ago
Yen 51ba56890b 客户帐余 2 years ago
Yen e03b10f168 客户帐余 2 years ago
Yen 082af49046 核销支持情况查询;修复预算异常 2 years ago
15989082884@163.com 8370648c58 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 488fd57501 客户导出调整 2 years ago
Yen d25f19a17a 核销支持情况查询 2 years ago
Yen 0560ffa2d4 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen c7343b553b 活动核销情况查询 2 years ago
15989082884@163.com a344eaa3e3 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com ecf5bf21df 客户导入修改 2 years ago
15989082884@163.com 35ae8f8b94 BIR和台帐修BUG 2 years ago
Yen 5610abd3f5 修复导入预算修改金额异常 2 years ago
Yen fe3247d253 修复预算批量导入丢失品类条件异常 2 years ago
Yen 65083929de Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen da192d7807 his客户闭户信息;预算申请异常修复;协议类关联信息 2 years ago
15989082884@163.com 682e59cb1c Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com f22d1af111 导入客户,时间为空时补null 2 years ago
Yen 8d640e63cb debug 2 years ago
15989082884@163.com 3a7cb3bef4 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 53f22f063b 客户导入BUG 2 years ago
Yen 0a6562abf2 添加远程密码修改;核销添加省市区 2 years ago
Yen f80843d1b5 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 85f9090561 核销添加费率信息; 2 years ago
15989082884@163.com 355d4eaf82 客户导入BUG 2 years ago
15989082884@163.com a375936d75 客户导入,删除校验调整 2 years ago
15989082884@163.com bc535036c0 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 2552f0d053 客户导入BUG修复 2 years ago
Yen 181386c587 加签支持评论;添加税务信息; 2 years ago
Yen 61af96f56c 批量导入预算审批(添加页面相关接口,测试中); 2 years ago
Yen b53d407fc2 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 80bd0f1c98 批量导入预算审批(添加页面相关接口); 2 years ago
15989082884@163.com 8af93bc246 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com cc1d4fb3e9 客户导入接口 2 years ago
Yen dabbaf9d80 暂存批量导入预算审批(导出,联合测试);修复商品类目异常 2 years ago
Yen 74c9ff7a91 暂存批量导入预算审批(导出,联合测试) 2 years ago
Yen c85272fb69 暂存批量导入预算审批(适配更变记录) 2 years ago
Yen b14733f40e 暂存批量导入预算审批 2 years ago
Yen 313091847b 暂存批量导入预算审批 2 years ago
Yen b9add815b5 暂存批量导入预算审批 2 years ago
Yen e19057de0f 暂存批量导入预算审批 2 years ago
Yen 704075fb30 初始化批量申请项 2 years ago
Yen 7a8753741c 添加核销重复提交拦截;添加批量导入实体类 2 years ago
Yen 04603cc8ab debug 2 years ago
Yen bae204b51f 添加查询参数修复;修复核销状态 2 years ago
Yen 0e7b5509ba 我的客户、我的渠道、我的渠道网点的导出接口 2 years ago
Yen e449f7fb2a 调整 2 years ago
Yen 1e12a30815 适配商城端页面接口;修复客户查询翻页异常; 2 years ago
Yen e24b5aef1e 适配商城端页面接口 2 years ago
Yen 8747967f9e 添加小程序登陆接口(未实现);客户添加关键字查询 2 years ago
Yen bc3a9c3daf 核销的释放异常修复 2 years ago
Yen 97af43782e 核销的释放异常修复 2 years ago
Yen 2f797b6e24 添加立刻离职导出接口 2 years ago
Yen 37d26c08de Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 1966483644 预算审批异常修复 2 years ago
15989082884@163.com 2897bf4f75 调整分页排序 2 years ago
15989082884@163.com dbfbf79dc8 费用分割小数位 2 years ago
15989082884@163.com 18f6358284 修复费用率 2 years ago
15989082884@163.com 71c27263b1 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 4c76b7fd34 客户导出 2 years ago
Yen 9478e7dd98 预算审批异常修复;添加导出接口;审批释放预算异常; 2 years ago
Yen 19ec22b0ee 预算审批异常修复;添加导出接口 2 years ago
Yen c7d42936a2 导出待测试 2 years ago
Yen ac0ffa9077 匹配规则异常修复;人员离职定时任务; 2 years ago
Yen 843e2eaca7 匹配规则异常修复;人员离职定时任务; 2 years ago
15989082884@163.com 7ac5b7d3b7 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 53361468d9 BIR导出接口 2 years ago
Yen ba7527f2fb 修复异动异常; 2 years ago
Yen 79ac7a5808 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen e55a1e3fcf 修复冻结; 2 years ago
15989082884@163.com 28554bf0a2 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 6fa6d2c223 BIR修复精度BUG 2 years ago
15989082884@163.com 8fc428fd80 BIR修复精度BUG 2 years ago
Yen db94405bbe Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 52d2480ecc 动态表格 2 years ago
15989082884@163.com e55ce18a91 修复BIR数据删除数据后,没有拿最新的LIST分割 2 years ago
15989082884@163.com 8b6fce0af5 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 563b7e3df7 客户查询条件加两个 2 years ago
Yen 1b036fbccb 动态表格 2 years ago
Yen 9ee54e6b54 动态表格 2 years ago
Yen 239cf7d478 预算审批异常修复;动态表格临时保存 2 years ago
Yen eb72b4515d 新匹配方式优先级异常修复;审批顶层接口修改 2 years ago
Yen 60cd01895a excel动态数据表初始化 2 years ago
Yen e523becef4 debug,excel动态数据表初始化 2 years ago
Yen 24a5d5ae84 预算审批功能补充附件 2 years ago
Yen 8eb021f329 预算审批功能补充 2 years ago
15989082884@163.com c1f9591492 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com efbac7b78d 费用申请 2 years ago
Yen 924c2335e1 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen f324a0a0d5 预算审批功能补充 2 years ago
15989082884@163.com 553019ed9c 操作手册 2 years ago
15989082884@163.com c01d0b56a4 客户添加闭户和暂不合作字段 2 years ago
15989082884@163.com 5781484c0d 操作手册接口 2 years ago
15989082884@163.com 7fa7cae6b0 网点传入行政区域CODE 2 years ago
15989082884@163.com 40e6795bd2 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com b8c9a883c0 导入行政区域拦截去除 2 years ago
Yen d0c1397a4e debug 2 years ago
Yen 5d46d4729d 回退的审批合并 2 years ago
Yen 655b78524d 调整审批 2 years ago
Yen b91229a071 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 7e0d0ddac8 预算修改的申请审批 2 years ago
15989082884@163.com 34981a1fa3 客户查询条件 2 years ago
15989082884@163.com 2115d1f034 预算日志查询 2 years ago
15989082884@163.com ae050c6499 目标预算 2 years ago
15989082884@163.com cfac1fc671 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 4131196f71 目标预算计算调整 2 years ago
Yen d50967bcba Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 6524dd9344 预算修改的申请审批 2 years ago
15989082884@163.com c25d98e806 渠道 和网点查询 2 years ago
15989082884@163.com 2913b32174 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com fcd91f0dd2 客户查询 2 years ago
Yen ec5da7f40e 预算修改的申请审批 2 years ago
Yen 42e28f1d7e 预算申请审批 2 years ago
15989082884@163.com 1cd16a1d55 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com ac94661353 客户查询条件 2 years ago
15989082884@163.com 488e7fbdd4 客户查询条件 2 years ago
Yen 886a57f561 预算添加审批 暂存 2 years ago
Yen e0f13940d8 面板回退列表; 2 years ago
Yen e79d08a018 核销审批附件上传日志; 2 years ago
15989082884@163.com acef711834 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com bd90f9f713 添加客户查询条件 2 years ago
Yen c37b79704b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 6ca8b975e1 费用申请、政策审批附件上传日志; 2 years ago
15989082884@163.com 466ccdac1d Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 2ea178e9e2 网点添加查询客户条件 2 years ago
Yen 01e858cea3 OA跳转到审批页重构 2 years ago
Yen 772a032d4b OA跳转到审批页重构 2 years ago
15989082884@163.com 8dce2df955 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 0b341ace82 渠道PAGE添加查询条件 2 years ago
15989082884@163.com 73fdcac851 微信公众号 2 years ago
Yen c574352331 修复费用状态异常;费用审批合并释放 2 years ago
Yen d901fb0b84 标签调整;修复空姐点导致的状态异常 2 years ago
Yen 95b034c23a 标签调整 2 years ago
Yen 0e6e39d1ea 审批金额修改记录表 2 years ago
Yen 9a21a62913 审批金额修改记录表,核销完成后冻结状态回调 2 years ago
Yen 9179b0068e 修改核销到销路通传参 2 years ago
Yen afa836a9ca 修改金额同步预算占用 2 years ago
15989082884@163.com 3f4ae1555d Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 2d0731295a BIR添加删除的ID表 2 years ago
Yen 27bf73e5b0 修改金额测试 2 years ago
Yen fa0014b4a5 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 45286dfbe0 添加费用申请复制 2 years ago
15989082884@163.com 4b98faccec Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 0242a2ffb5 添加字段channel 2 years ago
Yen dbfc9e97d6 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 5535e9a9d1 审批时修改金额流程,已测试 2 years ago
15989082884@163.com 335458da5f Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 4834cee34d 添加字段 2 years ago
Yen 723854b9f9 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 84c4f3fca0 审批时修改金额流程 2 years ago
15989082884@163.com 527e1637e1 审批回显,显示HR岗位 2 years ago
15989082884@163.com ef967d3db7 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 45a30ba7e8 修复渠道导入BUG 2 years ago
Yen b5ceffce98 协议类核销流程 2 years ago
Yen 8d63a74c14 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 379c001ed0 导入网点BUG 2 years ago
Yen 19203ac668 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen c88fa8f7ed 异动修复;新增协议类核销流程 2 years ago
15989082884@163.com 59b6fa0012 传入ID 2 years ago
15989082884@163.com f27bbe24f7 用户ID传入用传入的 2 years ago
15989082884@163.com efdbe655f2 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 129487590d 导入 2 years ago
Yen a822a57536 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 6b412c0494 debug 2 years ago
15989082884@163.com 1ff732eac1 预算修改BUG 2 years ago
15989082884@163.com e5ad1e1b82 添加接口 更新开启后的预算 2 years ago
15989082884@163.com ba97aeddaf 修改预算 2 years ago
15989082884@163.com c1c6ade001 模糊搜索 2 years ago
15989082884@163.com 9d504ae4e6 渠道添加字段总公司渠道 2 years ago
15989082884@163.com 02f1f937b9 微调渠道字段,修复预算显示BUG 2 years ago
15989082884@163.com bcb4b6ff38 网点导出和查询调整 2 years ago
15989082884@163.com 5b42ee3adf Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 231b4073ad 导入网点 2 years ago
Yen 287e7b85f4 匹配查询优化 2 years ago
Yen ca1a56545d 拼接匹配规则预览1测试 2 years ago
15989082884@163.com c48623efc6 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 9ad7f6045c 导出导入渠道 2 years ago
Yen 0b5e9e8009 拼接匹配规则预览1测试 2 years ago
Yen 2915ec393e 拼接匹配规则 2 years ago
Yen b222011cb4 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 4f1187d757 异动测试;作废功能测试 2 years ago
15989082884@163.com 40e832044a 人员添加字段HR信息 2 years ago
Yen db4ff0490b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 7172e39636 异动调整 2 years ago
15989082884@163.com ecad540dc7 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com edf4d90f40 客户查询添加空区域查询条件 2 years ago
Yen da924e2469 异动调整 2 years ago
15989082884@163.com 47779d75a8 预算金额大部份要弃用 2 years ago
15989082884@163.com 11eb1cfaad Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 85c81cea46 预算修改BUG 2 years ago
Yen ce2814c1da 协议类申请DATA调整 2 years ago
Yen ea21ced20c 异动触发费用复制 2 years ago
Yen 5e8c3d34d5 核销作废 2 years ago
15989082884@163.com 196dffff22 修复SUBLIST成本中心费用率合并错误 2 years ago
Yen 31b537028e 合同类调整;添加印章;重置密码 2 years ago
Yen a69b4f1998 合同类调整;添加印章;重置密码 2 years ago
15989082884@163.com 4487473a60 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 9921f514b4 添加备注字段 2 years ago
Yen 8465385fe3 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen e458b0139f 费用作废 2 years ago
15989082884@163.com b610c475b5 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 15d22394ab 查询当前客户的 渠道和网点,可以通过客户ID筛选 2 years ago
Yen 2c78cd7347 费用作废 2 years ago
Yen e4aa762dec 费用匹配预览表;费用作废 2 years ago
Yen 379ebdd684 微调 2 years ago
Yen 68501d7e6f 微调 2 years ago
Yen 4f4608bd18 优先级排序 2 years ago
Yen 6115b98535 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 9ee3e4d8b2 合并分支 2 years ago
Yen ebe6f8c430 Merge remote-tracking branch 'origin/contract' into v1.0 2 years ago
15989082884@163.com 62cb068b7b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 54207595a8 预算周期平帐 2 years ago
Yen df29727e3b 审批列表整合 2 years ago
Yen cd15d41e5b 审批列表整合 2 years ago
Yen 4c2219948b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen b71392d7ba 审批列表整合 2 years ago
15989082884@163.com 1dae6e80ee 费用率,添加政策ID查询 2 years ago
15989082884@163.com fa9984a4ab 成本中心费用率查询 2 years ago
15989082884@163.com dc0eb4fdc4 台帐发货表 2 years ago
15989082884@163.com dfee8c94cb 定时生成台帐发货表 2 years ago
15989082884@163.com f7085e3d82 封装成本中心费用率函数 2 years ago
15989082884@163.com 0d7abad4bd 预算添加附件 2 years ago
15989082884@163.com 7e4756a56d Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com f7e1a7c23f 底表查询 和 预算调整添加接口 2 years ago
Yen 4398d3dc1c debug暂存 2 years ago
15989082884@163.com 0694527428 修BUG 2 years ago
15989082884@163.com 95bfe02247 修BUG 2 years ago
15989082884@163.com ec3555e2f5 费用率 2 years ago
15989082884@163.com a52a1f072c Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com b5cf12d40b 明细表 2 years ago
15989082884@163.com 03a662bc77 成本中心关联销售区域 2 years ago
Yen 0fc65fa52b debug暂存 2 years ago
Yen a4989f6304 暂存 2 years ago
Yen cd2555c8a7 修改字段精确度 2 years ago
15989082884@163.com cdd83bb7f1 费用率 2 years ago
15989082884@163.com af397c9e05 费用率 2 years ago
15989082884@163.com 707761ed6d 费用率 2 years ago
15989082884@163.com 861418636b 成本中心 绑销售区域发货 2 years ago
15989082884@163.com 0ec67a02c1 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com b19a6a5e53 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 84f9e624d5 整合union 2 years ago
Yen 4ef56ba648 Merge remote-tracking branch 'origin/contract' into contract 2 years ago
Yen 53627d1d50 整合union 2 years ago
Yen 3bd269296f Merge remote-tracking branch 'origin/v1.0' into contract 2 years ago
Yen ead31287d2 debug 2 years ago
15989082884@163.com 95f70c5d2c 添加商品belong 2 years ago
Yen ad2324d307 协议类费用申请调整 2 years ago
Yen ac04efc9c3 debug 2 years ago
Yen 3fadd750f0 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 6ceeb30df3 放开销售区域删除 2 years ago
15989082884@163.com fdbeeb055d 修复 多次回退 log表会出现重复释放费用 2 years ago
15989082884@163.com e42fe28916 BIR添加销售区域和行政区域 2 years ago
Yen a86abaaf60 修改费率精确度 2 years ago
Yen 0d1713787e 协议类费用申请调整 2 years ago
Yen 49a0417d0c Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 757d82df97 成本中心重构 2 years ago
15989082884@163.com 52d428024a Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 3b4be9f3c0 分割数据 2 years ago
Yen 1108ae921a 成本中心重构 2 years ago
15989082884@163.com 04456e6523 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 31d7826423 修改迁移成本中心的接口路径 2 years ago
Yen 15178770d9 政策排序异常 2 years ago
Yen 78331b154a 编码补零;成本中心逻辑重构 2 years ago
15989082884@163.com 046795ba04 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 6c013b377d 添加成本中心迁移函数,迁移预算和费用 2 years ago
Yen e72d4d55dc 编码补零;成本中心逻辑重构 2 years ago
15989082884@163.com 9ce05d8eac Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 72ff1773b4 台帐 2 years ago
Yen 67e2325bc9 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen c0735957dc 编码补零;销售区域添加停用及别名;成本中心逻辑重构 2 years ago
15989082884@163.com 95d07c5bd7 活动的核销提交次数 2 years ago
15989082884@163.com f22c9b8eb0 测试环境,数据库数据有误,这个ID应该不用改的 2 years ago
Yen 7cfcda34ca 修复预算导出缺失政策信息 2 years ago
Yen 0913d8b281 政策字段调整 2 years ago
Yen 54d037528f 政策补偿 2 years ago
Yen be7360b89a subList空指针 2 years ago
Yen f76946aa66 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen e795bf6bc6 debug 2 years ago
15989082884@163.com 30d60bc771 预算查看 2 years ago
15989082884@163.com b971d61c2f 修BUG 2 years ago
15989082884@163.com fb221b8422 对帐单明细 和 汇总导出 2 years ago
Yen 12b8db02f4 BirActivityCenterGood添加核销分割;修改费用补偿;核销补偿;各审批编码修改;subList异常修复 2 years ago
15989082884@163.com 0d3fc29c88 调整 客户金额 和客户明细帐总帐的导出功能 2 years ago
15989082884@163.com 085fcbfa9b 核销表添加costApplyId 2 years ago
15989082884@163.com b7ca860bc0 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 354f3ebb5f 导出客户费用金额 2 years ago
Yen a640ea2b4a 添加费用申请时子表费率 2 years ago
15989082884@163.com 4bc923708d 修复自动冻结BUG 2 years ago
15989082884@163.com 0aab443dfd Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 93b4c706c3 调整产品信息接口 返回 品牌品类系列名称 2 years ago
Yen 18fc9129d8 修复提交时可用费用异常 2 years ago
15989082884@163.com 196305dcfe 添加字段显示费用申请 产品信息 2 years ago
15989082884@163.com 1553e6d51d 解除销售区域 和 行政区域最后一级限制 2 years ago
15989082884@163.com 0a2ee4ffa0 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 4011bef6e8 台帐查询 2 years ago
Yen a0cc25d858 Web部署支持 2 years ago
Yen afed258a0a 添加OA用户精确查询 2 years ago
15989082884@163.com 94838ca961 规划预算 2 years ago
15989082884@163.com 8c99b1708c Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com ca92a19cd6 台帐 2 years ago
15989082884@163.com b9b2968fe9 改BUG,自动冻结时间取预计核销 2 years ago
Yen 3d61f6416e 解决H5页面权限不刷新 2 years ago
15989082884@163.com d6caf3cf33 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 63d9c68780 报表 2 years ago
Yen 8c7f75ae57 解决H5页面权限不刷新 2 years ago
15989082884@163.com 0b72a5bb4d Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 754a0c9096 报表 2 years ago
Yen c646a685fd 解决H5页面权限不刷新 2 years ago
15989082884@163.com 8fc345c91f Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com fd2b7f5ff4 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 86a8aab539 区域BUG 2 years ago
Yen f6d86b25ee 活动,费用申请添加字段 2 years ago
Yen e5bbf4125a 预算周期底表分割(未测试) 2 years ago
Yen ff5adcb6f3 预算周期底表分割 2 years ago
Yen addff02b87 活动底表分割 2 years ago
Yen 425d7aa7ea 活动底表分割 2 years ago
Yen bb3dd7d892 活动底表分割 2 years ago
Yen 7cfef793e3 活动底表分割 2 years ago
Yen 22088e4516 添加模板字段 2 years ago
15989082884@163.com bbc1a79630 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 00178be5c6 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 4a5370b0d6 存货查询SQL BUG 2 years ago
Yen 29c692ad25 添加费用申请统计字段 2 years ago
Yen 6e16c8853d 取消随货拦截 2 years ago
Yen daa141a76b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen b58a8dffe9 同步用户调整 2 years ago
15989082884@163.com a874b98aac SPU接口接参修复 2 years ago
15989082884@163.com e567c25c0c 进场费查询调整 2 years ago
15989082884@163.com fa6d683de4 根据IDS查预算,商品 2 years ago
15989082884@163.com 9648d70213 保存activity时,传入模板指定预算ids,如模板预算存在,计算预算命中时,筛选预算ids 2 years ago
15989082884@163.com 95cb011d4e 逾期时间BUG 2 years ago
15989082884@163.com 0b8be6398f 添加预算IDS查询条件 2 years ago
15989082884@163.com 199d2c9c04 核销时间筛选,用finishTime作为时间条件 2 years ago
15989082884@163.com bc9dc7ff43 活动标题没有更新 2 years ago
15989082884@163.com 65d1f73d61 添加进场记录模糊查询 2 years ago
15989082884@163.com da2e60d1e8 修复科目GETBYID的父名称 2 years ago
Yen f1727f5508 政策的预算占用优化 2 years ago
Yen 4db9d58ff2 默认密码校验;模板拓展接口 2 years ago
15989082884@163.com bdb221a047 修BUG,BIR为空报错,销售区域查询,USER的OA帐号为空 2 years ago
15989082884@163.com 5a8bd20d66 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 44c441422f 修复查询销售区域的BUG 2 years ago
Yen f6a56c4d49 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen f74b6b5566 修改费用申请参数名,HIS表清空,对账单BUG 2 years ago
15989082884@163.com 5d461bf510 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com fce51434b8 费用率 2 years ago
Yen 8813181c47 修改费用申请参数名 2 years ago
15989082884@163.com 5785e0bd4b 费用率 2 years ago
15989082884@163.com ac9778d8c7 目标发货额 OA传参 2 years ago
15989082884@163.com faf2b690c4 预计发货 2 years ago
15989082884@163.com 30347c0fb1 开启费用率更新 2 years ago
Yen 44803e7ade 审批调整 2 years ago
15989082884@163.com e4997f1d7b OA的费用率 2 years ago
15989082884@163.com 26ce635192 费用率调整,加了 传去OA的几个费用率查询函数 2 years ago
15989082884@163.com 3ac9becd11 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 9ed300740d 费用率 2 years ago
Yen cd8405daf5 进场费;审批调整 2 years ago
Yen b9ad8de63f 进场费;审批调整 2 years ago
15989082884@163.com ae91dc34d3 费用率 2 years ago
15989082884@163.com 31fb56c139 科目接口 BUG 2 years ago
15989082884@163.com 91219630b5 费用率处理和计算 2 years ago
15989082884@163.com e4f5084289 费用率 2 years ago
15989082884@163.com f9f00e7480 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 2d3a2c12af 科目树,传入进场时,增加过滤 2 years ago
Yen f41cad7761 费率同步修复 2 years ago
15989082884@163.com 14d2ae0d35 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 49f703fbfe 费用率BI 2 years ago
Yen 5f9e08d045 费用预览,可用预算调整 2 years ago
Yen a60e6117f6 费用预览,可用预算调整 2 years ago
Yen b32b01b140 费用预览,可用预算调整 2 years ago
Yen b8887b2db4 整合同步按钮调整 2 years ago
Yen e6d42c9292 整合同步按钮调整 2 years ago
Yen 40888dc106 进场费模板;费用申请添加科目表单 2 years ago
Yen 8e1c2d08d0 debug 2 years ago
Yen 79aec91e47 debug 2 years ago
Yen ea7b0f67ba 添加逾期 2 years ago
Yen 220f41af26 添加逾期 2 years ago
Yen c1674f87c6 修复查询 2 years ago
Yen 7dc7d02432 需求调整 2 years ago
Yen 0285d9becd 需求调整 2 years ago
Yen 35b207f958 需求调整 2 years ago
Yen 33d471667c 调整 2 years ago
Yen 393eb23e5c 查询优化 2 years ago
Yen 44ce144130 重定向 2 years ago
Yen d325b80e42 重定向 2 years ago
Yen e7cea93991 debug 2 years ago
Yen 17aadd0238 添加政策到预算日志 2 years ago
Yen c78283e6b3 debug 2 years ago
Yen c7857bc15a debug 2 years ago
Yen 6544955781 政策添加申请时间 2 years ago
Yen acca21a649 政策排序修复;金额异常修复 2 years ago
Yen 1d0fd9dde9 致远跳转;政策调试;报表VO; 2 years ago
Yen 9799061803 ROI费率 2 years ago
Yen d5839b94d4 ERP发货单 2 years ago
Yen 310bcc8a96 对账单对接完成 2 years ago
Yen 807bf8d955 后继成本中心修复;拜访定位标识调整; 2 years ago
Yen 43363c1fcb 查询异常修复 2 years ago
Yen c598174fd8 ROI费率底表 2 years ago
Yen f57023830f ROI费率底表 2 years ago
Yen 6510a55390 政策排序重构 2 years ago
Yen 8a47decc48 对账单完成,未测试 2 years ago
Yen 03c113a87d 修复异常 2 years ago
Yen 1fa85a913e 修复异常 2 years ago
Yen e587656e20 配置同步 2 years ago
Yen b76801438b 同步用户客户表触发逻辑修改 2 years ago
Yen 1137fdd2b3 新增后继成本中心;修复部分异常 2 years ago
Yen da4fa1aa83 核销兼容协议类,业务状态修复 2 years ago
Yen 54831a6d38 核销兼容协议类 2 years ago
Yen 1a27bc608f debug 2 years ago
Yen bc49d4d666 APP错误日志 2 years ago
Yen 0eb3e2dbc1 调整 2 years ago
Yen df911df491 单点登陆;未审批统计;活动模板统计 2 years ago
Yen e60c7f9684 debug,加签异常修改 2 years ago
Yen 7d7b0814b6 预算底表统计调整 2 years ago
Yen 8f002ac75d 预算日志底标调整 2 years ago
Yen b7874ee6a4 添加加签;完成部分费用重构 2 years ago
Yen 30d220fd35 微调 2 years ago
Yen 8333a2c791 添加字段 2 years ago
Yen 662c88f6e2 debug 2 years ago
Yen 793ca48eaf 定义补偿规则;添加核销支付方式 2 years ago
Yen 8c647c416e debug 2 years ago
Yen 54cb0705cb 核销超支异常修复;模板可见范围查询修复 2 years ago
Yen bf176b0069 还原不使用雪花ID 2 years ago
Yen 8c4288c307 审批相关数据ID使用雪花算法,修复区域数据关联 2 years ago
Yen abd1207edc 审批相关数据ID使用雪花算法,修复区域数据关联 2 years ago
Yen 14c5791337 活动模板日志显示异常 2 years ago
Yen 288ac19795 修复费用状态异常 2 years ago
15989082884@163.com 4a4befecd0 init函数取消递归,传入是否查询下级参数 2 years ago
15989082884@163.com a97cfe1309 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com a1152104fd 测试初始化缓存接口 2 years ago
Yen d639f5703b 调整 2 years ago
Yen 4651e3e227 排序优先级重构 2 years ago
Yen d98f62d25e 修复复杂查询翻页异常 2 years ago
Yen 5e6ec4fc4a 调整 2 years ago
Yen 666045f7d2 调整 2 years ago
Yen c7721ecb5f 调整 2 years ago
Yen c7fd940c01 调整 2 years ago
Yen 765bce981d 大调整 2 years ago
Yen e35503bdf1 费用优先级调整:时间区间内,区间长度取最短 2 years ago
Yen b1935f4af3 费用优先级调整 2 years ago
Yen 5783b929a1 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen 05d0acc723 费用优先级调整 2 years ago
15989082884@163.com 685c0953a1 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 5a9016d5f5 消息 2 years ago
Yen 707607fe06 修复推送异常 2 years ago
Yen 7bc1df34c8 微调 2 years ago
Yen cd03a6a276 微调 2 years ago
15989082884@163.com 03e9e69b24 推送消息接口 2 years ago
15989082884@163.com 5b210d6e9b Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 60d44d5ae1 岗位调整 2 years ago
Yen 78b70ef95c 微调 2 years ago
Yen f14bfdc647 微调 2 years ago
Yen 2b5f6b00b6 修复区域用户绑定失败 2 years ago
Yen 03e6d36ae5 修复登陆异常;统一规范我的客户,下属的客户 2 years ago
Yen 65d23213d4 微信表单推送、负责人重构 2 years ago
Yen ab3f4ddba3 微信表单推送、负责人重构 2 years ago
Yen 3b44a5f728 调整 2 years ago
Yen 9f07507173 调整 2 years ago
Yen f3fe5bd5b6 调整 2 years ago
Yen ae806ba345 调整 2 years ago
Yen 2bb0a82d57 调整 2 years ago
Yen 388591d88d 调整 2 years ago
Yen 28e3d861f1 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
Yen aca1959c0f 调整 2 years ago
15989082884@163.com f7d362b398 部门没用到,线上环境查询超慢 2 years ago
Yen 298b406dfb 表单推送,供应商联系人等 2 years ago
Yen 695b48f04e debug 2 years ago
15989082884@163.com ca110fa24d Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 5c4f24fd4e 定位打卡倒叙 2 years ago
Yen feefbb02fa 调整API用户登陆逻辑 2 years ago
15989082884@163.com 54ef29ee47 调整API接口,从微信用户拿USERID 2 years ago
15989082884@163.com a51171f509 Merge remote-tracking branch 'origin/v1.0' into v1.0 2 years ago
15989082884@163.com 7531f91511 修复销售人员链 2 years ago
Yen 2671a7eb25 拜访调整 2 years ago
Yen e6ab71f616 拜访调整 2 years ago
Yen 0f2951a197 拜访调整 2 years ago
Yen 286f9585d7 网点区域 2 years ago
Yen a5abc392b0 update 2 years ago
Yen 273ca2791d 微信用户绑定缓存修复 2 years ago
Yen 76f28ada39 拜访模板 2 years ago
Yen 1dfc2a03b1 拜访模板 2 years ago
Yen 09dccac8d0 拜访模板 2 years ago
Yen 2dacd27b7e 拜访模板 2 years ago
Yen 606a251df4 debug 2 years ago
Yen a5ce42012d debug 2 years ago
Yen 269604e92e debug 2 years ago
Yen aaeeeef0af 客户拜访调整、政策异常修复 2 years ago
Yen 480b11f604 客户拜访调整 2 years ago
Yen 2efbfc6766 查询优化 2 years ago
Yen 051d5d70cf 拜访流程调整、OSS调整 2 years ago
Yen 12ca0f0c88 拜访流程调整 2 years ago
Yen 233b25e548 拜访流程调整 2 years ago
Yen a2ea372419 新增的拜访流程调整 2 years ago
Yen 2f2a58fbaa 登录调整、新增的拜访流程调整 2 years ago
Yen 73a0dd36f4 登录调整、新增的拜访流程调整 2 years ago
Yen 73349fe231 update 2 years ago
Yen 258930bb8d 上传调整 2 years ago
Yen fdcb2eda84 调整客户区域更变预算 2 years ago
Yen 67cba004a4 对接核销费用申请,添加对接日志 2 years ago
Yen a0ea68b918 对接核销费用申请 2 years ago
Yen c41740955c 对接核销费用申请 2 years ago
Yen 5a1f5afd32 费用添加合同 2 years ago
Yen 2f59af99f4 费用添加合同 2 years ago
Yen b35e13921e 成本中心(区域添加供应商负责人的区域) 2 years ago
Yen 826f6b72e2 对接核销调整 2 years ago
Yen 1405848e98 政策同步到销路通 2 years ago
Yen f024c7dbb8 添加科目适用区域 2 years ago
Yen 9fbe4f6aba 添加科目适用区域 2 years ago
Yen 3888a02473 添加科目适用区域 2 years ago
Yen 6b4f669123 添加科目适用区域 2 years ago
Yen 6edb83e99b 添加政策日志;一条龙接口拓展保存apt和xlt参数 2 years ago
Yen 5027efde46 政策预算2 2 years ago
Yen 6e8081b3da 修复无预算空指针移除;添加政策同步商品记录; 2 years ago
Yen 76ae7d2ad4 审批查询调整,政策提交审批接口 2 years ago
Yen 3f8daa61b0 审批查询调整,政策提交审批接口 2 years ago
Yen 48549323d0 兼容新版致远服务的接口 2 years ago
Yen daf5c1df14 提交政策审批,调整读取致远配置方式 2 years ago
Yen f619a4f743 兼容费用申请和政策的可用预算 2 years ago
Yen 5512163cd6 修复政策预览 2 years ago
Yen f4176d0cf8 政策发布,政策预览,第三方政策接口 2 years ago
Yen 39ae80ef28 政策发布,政策预览 2 years ago
Yen 7d86f66b21 发布政策 2 years ago
Yen b14427df45 发布政策 2 years ago
Yen c3e47363f4 添加政策 2 years ago
Yen 7ba09b8f09 添加评论 2 years ago
Yen 6b8a060cb5 添加TODO 2 years ago
Yen 645d45bd27 请求相关接口添加前置拦截;修复核销金额日志异常 2 years ago
Yen d970f2c736 添加核销系统生成费用接口 2 years ago
Yen 84c6056e7c 添加核销系统生成费用接口 2 years ago
Yen fcdb3c9af5 添加核销系统生成费用接口 2 years ago
Yen 049ee0ae7f 添加核销系统生成费用接口 2 years ago
Yen ce098c461d 调整审批流程,支持修改核销金额 2 years ago
Yen 8571b25cd6 调整审批流程,支持修改核销金额 2 years ago
Yen 207b4a8bb6 调整审批流程,支持修改核销金额 2 years ago
Yen 90ce38ebc4 调整审批流程,支持修改核销金额 2 years ago
Yen b56435a895 调整审批流程,支持修改核销金额 2 years ago
Yen d9b592fab9 添加用户离职调整;提交核销添加历史字段 2 years ago
Yen 6590150396 添加用户离职 2 years ago
Yen f7c78f036c 客户地区迁移,预算占用调整 2 years ago
Yen 0726c63fb4 修复预算预览科目显示异常;调整核销写入销路通等 2 years ago
Yen 184170c1a9 添加H5附件上传;新增核销模板相关字段;客户区域变得的费用预算调整 2 years ago
Yen 0c145ff1d3 区域调整更新预算 2 years ago
Yen d87cf73f48 科目表单支持 2 years ago
Yen dc47d27b73 添加预算超支表 2 years ago
Yen 066fbfa1dd 修复:费用申请回退后,预览金额重复扣除;预算日志添加预算考核期关联; 3 years ago
Yen d5d2b23606 调整费用申请的预览2 3 years ago
Yen 43e920d243 调整费用申请的预览 3 years ago
Yen fc47d09a53 添加对接OA的token,添加申请预算时金额记录字段 3 years ago
Yen 18f3fb3141 添加发布预算拦截 3 years ago
Yen da5ed32bba 去除科目拦截 3 years ago
Yen 30d9abb786 日志类型添加静态字段引用 3 years ago
Yen 77681edd9c 调整预算日志 3 years ago
Yen 6116742e7f 调整预算日志 3 years ago
Yen 91a99d1c6b 调整 3 years ago
Yen ea1b8aca5a 回退时预算统计错误修复 3 years ago
Yen 2baaff82f6 调整 3 years ago
Yen fc5252d845 调整 3 years ago
Yen f80d27287c 调整 3 years ago
Yen 0f87f11db9 客户搜索支持模糊 3 years ago
Yen 4d48476bdc 修复费用申请状态异常 3 years ago
Yen fcb3a06712 添加模板启停拦截 3 years ago
Yen 4a229eba72 修复模板显示状态异常 3 years ago
Yen c9d5cc8569 修复模板显示状态异常 3 years ago
Yen fdf2c34650 修复预算使用情况统计异常 3 years ago
Yen f464b2019d 修复预算使用情况统计异常 3 years ago
Yen 64eb07ba85 修复预算使用情况统计异常 3 years ago
Yen a5fc61c1ee 修复预算使用情况统计异常 3 years ago
Yen d0a5804886 审批流程调整 3 years ago
Yen f6e9bfe4d3 修复费用申请预览异常 3 years ago
Yen 7e5814d0c1 修复客户、预算显示异常 3 years ago
Yen 6b3498c36e 对接OA调整;修复商品sku异常 3 years ago
Yen b4efd7c549 对接OA调整 3 years ago
Yen a67a4d7ee7 调整新增的页面接口 3 years ago
Yen 9021b348e6 调整新增的页面接口 3 years ago
Yen c5658e3ed8 修复预算预览接口优先级异常 3 years ago
Yen cd5fad7b0e 预算日志-补充统计接口 3 years ago
Yen 69b762739d 预算日志-调试完成 3 years ago
Yen 25d5409461 预算日志-费用日志 3 years ago
Yen d4d4cddc7b 预算日志-调增调减日志 3 years ago
Yen aadfd3f16b 预算日志-费用申请日志 3 years ago
Yen fcad070020 预算日志-预算新增日志 3 years ago
Yen 81c165224a 添加可投放费用字段查询调整,添加模板日志 3 years ago
Yen 37a297cfea 客户、渠道、渠道网点、类目、SPU、SKU添加 是否可投放费用字段 3 years ago
Yen 84bcbd47a3 修复负责人关联表异常 3 years ago
Yen 7ac9e0a83e 修复模糊查询 3 years ago
Yen 17f7005419 支付记录到中间表 3 years ago
Yen c571508a2c 核销记录推送到销路通中间表 3 years ago
Yen 2aa076ef25 默认成本中心接口调整 3 years ago
Yen 5c199b3d37 支持期初欠款支付 3 years ago
Yen e0dc1e0f7d 费用申请添加回退功能 3 years ago
Yen 458bea94d6 核销添加回退功能 3 years ago
Yen 13f73fa775 添加默认的成本中心接口 3 years ago
Yen 2e2bf251ce 对比预算接口,调整;添加我的模板列表 3 years ago
Yen 57a4f9e374 对比预算接口,调整 3 years ago
Yen 83ed1ad205 对比预算接口,debug 3 years ago
Yen 93ad55fbe2 对比预算接口 3 years ago
Yen 9f15e2964f 预算与活动匹配条件调整 3 years ago
Yen 7ed18c1eb7 修复核销显示异常 3 years ago
Yen f86cd4a9ee 支付功能,不再支付 3 years ago
Yen c23b780525 支付功能 3 years ago
Yen 1a7a00acb0 添加支付功能 3 years ago
Yen 63e5febcb2 客户字段冗余调整 3 years ago
Yen 67a792deed 核销对接OA 3 years ago
Yen bc8e36479c 对接OA提取通用方法,核销添加统计 3 years ago
Yen d4a65d4012 完成核销测试调整 3 years ago
Yen 9fe63806a8 费用申请对接OA调整 3 years ago
Yen 4f18c35f60 添加核销渠道和网点 3 years ago
Yen b3617a5543 预算费用占用 3 years ago
Yen 55c32bc6cf 预算费用占用,销售人员树调整 3 years ago
Yen b25ac0ab7e 预算费用占用,销售人员树调整 3 years ago
Yen ba29c4d83c 预算费用占用 3 years ago
Yen c5940b35be 预算费用占用 3 years ago
Yen 289fc81f2b 用户信息更新 3 years ago
Yen 436d95cb9d 预算费用占用 3 years ago
Yen e8d50a811c 预算费用占用,添加预览table 3 years ago
Yen 4eec06cfd7 Merge remote-tracking branch 'origin/mssql' into mssql 3 years ago
Yen 25d9170707 预算费用占用 3 years ago
07 fa48a7bbf5 导入EXCEL排除“”空字符串 3 years ago
07 3ea50426bd Merge remote-tracking branch 'origin/mssql' into mssql 3 years ago
07 d603c955ae 商品分类保存添加编码校验 3 years ago
Yen 6634cff88b 商品删除拦截 3 years ago
Yen 173b2e2af5 适配活动模板 3 years ago
Yen 194fe5d5f5 流程审批调整、客户查询调整、提取致远服务 3 years ago
07 a74e43543a 修BUG 3 years ago
07 a947ad7b2a Merge remote-tracking branch 'origin/mssql' into mssql 3 years ago
07 ea15990652 BMS调整和修BUG 3 years ago
Yen 880e22a341 添加活动模板 3 years ago
Yen 8745fc6266 添加释放费用、重新打开核销 3 years ago
Yen e5e0fdc0fa 活动添加流程调整,添加核销流水流程 3 years ago
Yen 150a479ae6 站点添加供应商条件查询 3 years ago
Yen 3cfa6a267e 初始化核销实体类 3 years ago
Yen 5d9b79869f 去除致远sdk 3 years ago
Yen 806043b16d 修复工厂排序、取消更新工厂同时更新祖级链 3 years ago
Yen ec5d2dea83 添加客户临时表、补充活动字段、添加致远SKD 3 years ago
Yen 86818b9af3 添加活动费用统计,关联活动显示参数 3 years ago
Yen fb66ffda4b 添加excel导入导出预算 3 years ago
Yen 7eb5b0f0a7 添加excel导入导出预算 3 years ago
Yen a27a036e02 添加excel导入导出预算 3 years ago
Yen 2e37ac397a 添加excel导入预算 3 years ago
Yen 0092bf4fe4 调整成本中心为公共模块,地区支持4级 3 years ago
Yen d18a9c8e55 区域调整为4级,活动添加客户数据 3 years ago
Yen 0f4da50132 产品成本配占比校验 3 years ago
Yen ccfee004ce 活动添加校验金额 3 years ago
Yen 17fdbeb7e5 预算添加启停状态 3 years ago
Yen b3df55fbb2 预算 3 years ago
07 70d03f2b99 网点的渠道名称缓存,修复 3 years ago
07 051040927e 预算成本中心类型 3 years ago
07 c8e7fe01e6 注释 3 years ago
07 cb965a044b 周期档案接口完善,BUG修复 3 years ago
07 32b8a65d1b 周期BUG 3 years ago
07 ca7b4d7324 修BUG 3 years ago
07 ae517ad45d 网点,区域,渠道,负责人,科目 3 years ago
Yen db26d50338 预算调整 3 years ago
Yen 444cb767a0 预算调整 3 years ago
Yen fc4bb62ab8 添加系统配置 3 years ago
Yen 07bb195ac3 发布费用活动 3 years ago
Yen 8c21f863f6 添加负责人 3 years ago
Yen f5c6876703 调整 3 years ago
Yen 028be59631 调整 3 years ago
Yen a14f066133 调整 3 years ago
Yen 9d421952a6 调整 3 years ago
Yen 99918664a0 调整 3 years ago
Yen 0114dbd828 调整 3 years ago
Yen 3ea1d3404d 调整 3 years ago
Yen 0d3d725485 调整 3 years ago
Yen d392e7b4cd 调整 3 years ago
Yen dc235eccfb 调整 3 years ago
Yen 16bcaae3d2 调整 3 years ago
Yen d8ec321eeb 添加行政区域 3 years ago
Yen 49cc00efdb 添加行政区域 3 years ago
Yen 92632fe227 客户添加其它负责人、添加账套编码 3 years ago
Yen 177288726e 下单流程 3 years ago
Yen 578198e4b4 下单流程 3 years ago
Yen 1aa4e8f5e6 调整 3 years ago
Yen 73931cbef5 调整 3 years ago
Yen e765af265a 调整 3 years ago
Yen 9ca400fe2d 调整 3 years ago
Yen 26c5562312 供应商接口调整 3 years ago
Yen bedf257db0 供应商接口调整 3 years ago
Yen 257c861c4d 下单规则整合 3 years ago
Yen 1b0f5b249a 下单规则整合 3 years ago
Yen 4b5fee97b7 下单规则整合 3 years ago
Yen 3c084657fa 添加购物车,添加订单,添加下单规则 3 years ago
Yen 55476a4b13 添加API接口,设置人员关联供应商 3 years ago
Yen 6f90c65d6c 添加成本中心、erp信息、商品单位、添加批量添加供应商 3 years ago
Yen ac7f98e092 添加人员树、供应商树、供应商地址及银行 3 years ago
Yen a800502b9d 添加品牌、系列、商品前台接口等 3 years ago
Yen 17aae6ae05 添加品牌、系列 3 years ago
Yen 33c79663fb 初始化商品模块 3 years ago
Yen 5106415afc 添加次数限制流程 3 years ago
Yen 96ced34865 添加组织架构批量接口 3 years ago
Yen 1ec8928d5b 移除用户多余代码 3 years ago
Yen 8a4c2922eb 调整到mysql 3 years ago
Yen bcb5010d45 debug 3 years ago
Yen 82d43987d5 兼容mssql 3 years ago
Yen bc37ef77bc 兼容mssql 3 years ago
Yen 33a376b6ac 兼容mssql 3 years ago
Yen fa1fb9eb85 兼容mssql 3 years ago
Yen 445e6095a7 兼容mssql 3 years ago
Yen a6fa7db976 兼容mssql 3 years ago
Yen a249821893 兼容mssql 3 years ago
Yen faa1a41a78 添加绑定流程 3 years ago
Yen 8dad0f7c1d 添加绑定流程 3 years ago
Yen f7bc5b1f34 版本调整 3 years ago
LYM ed172f9ab7 修改配置 3 years ago
  1. 17
      .gitignore
  2. 25
      doc/update.sql
  3. 56
      pom.xml
  4. 15
      src/main/java/com/qs/serve/Application.java
  5. 11
      src/main/java/com/qs/serve/common/config/DevEnvironmentConfig.java
  6. 4
      src/main/java/com/qs/serve/common/config/JwtConfig.java
  7. 3
      src/main/java/com/qs/serve/common/config/MyBatisConfig.java
  8. 23
      src/main/java/com/qs/serve/common/config/SpringMvcConfig.java
  9. 25
      src/main/java/com/qs/serve/common/config/properties/AliYunOssProperties.java
  10. 36
      src/main/java/com/qs/serve/common/config/properties/ProjectApisProperties.java
  11. 25
      src/main/java/com/qs/serve/common/config/properties/ProjectProperties.java
  12. 28
      src/main/java/com/qs/serve/common/config/properties/SeeYonProperties.java
  13. 4
      src/main/java/com/qs/serve/common/framework/annotations/TagField.java
  14. 5
      src/main/java/com/qs/serve/common/framework/aop/SysLogAspect.java
  15. 61
      src/main/java/com/qs/serve/common/framework/exception/UnifiedExceptionHandler.java
  16. 60
      src/main/java/com/qs/serve/common/framework/interceptor/ApiAuthInterceptor.java
  17. 286
      src/main/java/com/qs/serve/common/framework/manager/AsyncFactory.java
  18. 40
      src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java
  19. 51
      src/main/java/com/qs/serve/common/framework/redis/RedisService.java
  20. 30
      src/main/java/com/qs/serve/common/framework/redis/TtlRedisCacheManager.java
  21. 32
      src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java
  22. 18
      src/main/java/com/qs/serve/common/model/AmountDTO.java
  23. 20
      src/main/java/com/qs/serve/common/model/annotation/BusinessDifference.java
  24. 19
      src/main/java/com/qs/serve/common/model/chart/BiCommonCounter.java
  25. 15
      src/main/java/com/qs/serve/common/model/chart/BiMonthCounter.java
  26. 39
      src/main/java/com/qs/serve/common/model/chart/ChartAxisColumn.java
  27. 148
      src/main/java/com/qs/serve/common/model/chart/ChartDataVo.java
  28. 18
      src/main/java/com/qs/serve/common/model/chart/ChartGroupItem.java
  29. 26
      src/main/java/com/qs/serve/common/model/chart/ChartSeriesItem.java
  30. 75
      src/main/java/com/qs/serve/common/model/chart/PrintChart.java
  31. 13
      src/main/java/com/qs/serve/common/model/consts/ApplyTypeConst.java
  32. 21
      src/main/java/com/qs/serve/common/model/consts/BudgetLogRollbackFlag.java
  33. 1
      src/main/java/com/qs/serve/common/model/consts/GySysConst.java
  34. 19
      src/main/java/com/qs/serve/common/model/consts/RedisCacheKeys.java
  35. 12
      src/main/java/com/qs/serve/common/model/consts/ResultFlag.java
  36. 17
      src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java
  37. 29
      src/main/java/com/qs/serve/common/model/dto/DateSplitDTO.java
  38. 17
      src/main/java/com/qs/serve/common/model/dto/DiffFieldVal.java
  39. 27
      src/main/java/com/qs/serve/common/model/dto/HeaderOption.java
  40. 10
      src/main/java/com/qs/serve/common/model/dto/PageVo.java
  41. 50
      src/main/java/com/qs/serve/common/model/dto/R.java
  42. 26
      src/main/java/com/qs/serve/common/model/dto/RowParam.java
  43. 29
      src/main/java/com/qs/serve/common/model/dto/TargetDTO.java
  44. 17
      src/main/java/com/qs/serve/common/model/dto/TargetObjectDTO.java
  45. 2
      src/main/java/com/qs/serve/common/model/dto/TreeNode.java
  46. 3
      src/main/java/com/qs/serve/common/model/enums/BizType.java
  47. 91
      src/main/java/com/qs/serve/common/model/enums/BudgetLogOptFlag.java
  48. 2
      src/main/java/com/qs/serve/common/model/enums/HttpCode.java
  49. 40
      src/main/java/com/qs/serve/common/model/enums/MonthValues.java
  50. 14
      src/main/java/com/qs/serve/common/model/enums/SystemModule.java
  51. 36
      src/main/java/com/qs/serve/common/model/oa/OaFormMainProcess.java
  52. 27
      src/main/java/com/qs/serve/common/model/oa/OaUploadFile.java
  53. 62
      src/main/java/com/qs/serve/common/util/AuthContextUtils.java
  54. 79
      src/main/java/com/qs/serve/common/util/BusinessDifferenceUtil.java
  55. 146
      src/main/java/com/qs/serve/common/util/CodeGenUtil.java
  56. 67
      src/main/java/com/qs/serve/common/util/DateSplitUtil.java
  57. 29
      src/main/java/com/qs/serve/common/util/DateUtils.java
  58. 147
      src/main/java/com/qs/serve/common/util/HttpUtil.java
  59. 12
      src/main/java/com/qs/serve/common/util/IdUtil.java
  60. 107
      src/main/java/com/qs/serve/common/util/JdbcUtil.java
  61. 2
      src/main/java/com/qs/serve/common/util/JsonUtil.java
  62. 18
      src/main/java/com/qs/serve/common/util/JumpToUtil.java
  63. 22
      src/main/java/com/qs/serve/common/util/PageUtil.java
  64. 6
      src/main/java/com/qs/serve/common/util/ServletUtils.java
  65. 91
      src/main/java/com/qs/serve/common/util/StringUtils.java
  66. 85
      src/main/java/com/qs/serve/common/util/ValidateTools.java
  67. 10
      src/main/java/com/qs/serve/common/util/WarpUtil.java
  68. 1
      src/main/java/com/qs/serve/common/util/model/DateFormatString.java
  69. 28
      src/main/java/com/qs/serve/common/util/model/QsJsonLocalDateTimeDeserializer.java
  70. 122
      src/main/java/com/qs/serve/controller/AdminPortalController.java
  71. 12
      src/main/java/com/qs/serve/controller/CommonController.java
  72. 103
      src/main/java/com/qs/serve/controller/WxSvcLoginApi.java
  73. 27
      src/main/java/com/qs/serve/controller/dto/SyLoginParam.java
  74. 115
      src/main/java/com/qs/serve/controller/util/SyKeyLoginUtil.java
  75. 4
      src/main/java/com/qs/serve/modules/base/TencentYunSmsService.java
  76. 48
      src/main/java/com/qs/serve/modules/base/TianYiYunSmsService.java
  77. 122
      src/main/java/com/qs/serve/modules/base/controller/JslApiController.java
  78. 12
      src/main/java/com/qs/serve/modules/baz/common/BazTargetTypeConsts.java
  79. 148
      src/main/java/com/qs/serve/modules/baz/controller/BazVisitController.java
  80. 153
      src/main/java/com/qs/serve/modules/baz/controller/BazVisitFlowController.java
  81. 146
      src/main/java/com/qs/serve/modules/baz/controller/BazVisitInstanceController.java
  82. 231
      src/main/java/com/qs/serve/modules/baz/controller/my/BazMyVisitInstanceController.java
  83. 95
      src/main/java/com/qs/serve/modules/baz/entity/BazVisit.java
  84. 125
      src/main/java/com/qs/serve/modules/baz/entity/BazVisitFlow.java
  85. 119
      src/main/java/com/qs/serve/modules/baz/entity/BazVisitInfo.java
  86. 193
      src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstance.java
  87. 212
      src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstanceFlow.java
  88. 41
      src/main/java/com/qs/serve/modules/baz/entity/bo/BazCreateVisitInstanceBo.java
  89. 69
      src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowBo.java
  90. 30
      src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowSortBo.java
  91. 61
      src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitInstanceFlowBo.java
  92. 57
      src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitFlowSo.java
  93. 90
      src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceFlowSo.java
  94. 74
      src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceSo.java
  95. 14
      src/main/java/com/qs/serve/modules/baz/mapper/BazVisitFlowMapper.java
  96. 14
      src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInfoMapper.java
  97. 14
      src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceFlowMapper.java
  98. 19
      src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceMapper.java
  99. 14
      src/main/java/com/qs/serve/modules/baz/mapper/BazVisitMapper.java
  100. 17
      src/main/java/com/qs/serve/modules/baz/service/BazVisitFlowService.java

17
.gitignore

@ -1,8 +1,9 @@
.idea/
logs/
target/
gyoa-java.iml
*.http
*.env.json
*.json
/src/test/
.idea/
logs/
target/
gyoa-java.iml
*.http
*.env.json
*.json
/src/test/
questionnaire.iml

25
doc/update.sql

@ -0,0 +1,25 @@
update tbs_budget_condition set brand_id = SUBSTRING_INDEX(target_level_path_ids,'_',1)
update tbs_budget set center_combo = concat(center_type,'_',center_id)
update vtb_verification v
left join tbs_activity act on act.id = v.activity_id
set v.activity_code = act.activity_code
where v.verification_main_code like 'DHX%'
select tbs_budget.id from tbs_budget
LEFT JOIN tbs_budget_condition
on tbs_budget_condition.budget_id = tbs_budget.id
where tbs_budget.del_flag = 0
and tbs_budget_condition.del_flag = 0
and tbs_budget.condition_flag = 0
and tbs_budget_condition.id is not null
GROUP BY tbs_budget.id
update tbs_budget set condition_flag = 1
where id in (
)

56
pom.xml

@ -24,12 +24,26 @@
<httpclient.version>4.5.7</httpclient.version>
<commons-httpclient.version>3.1</commons-httpclient.version>
<fastjson.version>1.2.49</fastjson.version>
<mybatis-plus.version>3.4.1</mybatis-plus.version>
<mybatis-plus.version>3.5.2</mybatis-plus.version>
<skipTests>true</skipTests>
<wx.java.version>4.2.0</wx.java.version>
<lib.dir>D:\workspace-main\JiaShiLi\jsl-questionnaire-base\src\main\resources\lib\</lib.dir>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
@ -106,10 +120,11 @@
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
<version>1.4.4</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
@ -119,12 +134,13 @@
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
<!-- <exclusion>-->
<!-- <groupId>com.github.jsqlparser</groupId>-->
<!-- <artifactId>jsqlparser</artifactId>-->
<!-- </exclusion>-->
</exclusions>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
@ -137,11 +153,17 @@
<version>8.0.15</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.microsoft.sqlserver</groupId>-->
<!-- <artifactId>mssql-jdbc</artifactId>-->
<!-- <version>6.4.0.jre8</version>-->
<!-- </dependency>-->
<!--<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.1.jre8</version>
</dependency>-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
@ -188,6 +210,18 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.16.1</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
</dependencies>
<build>

15
src/main/java/com/qs/serve/Application.java

@ -1,6 +1,9 @@
package com.qs.serve;
import com.qs.serve.common.config.DevEnvironmentConfig;
import com.qs.serve.task.TbsTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -8,8 +11,10 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Indexed;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.annotation.PostConstruct;
@ -21,6 +26,7 @@ import java.util.TimeZone;
* @author YenHex
* @since 2022/2/24
*/
@Indexed
@EnableAsync
@EnableScheduling
@EnableTransactionManagement
@ -28,9 +34,15 @@ import java.util.TimeZone;
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Value("${project.dev}")
String dev;
public static void main(String[] args) {
DevEnvironmentConfig.openDevEnv(true);
long start = System.currentTimeMillis();
SpringApplication.run(Application.class,args);
long end = System.currentTimeMillis();
double diff = (end-start)/1000.0;
System.out.println("启动时间:"+diff);
}
@Override
@ -46,6 +58,7 @@ public class Application extends SpringBootServletInitializer {
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
DevEnvironmentConfig.openDevEnv(dev.equals("true"));
}
}

11
src/main/java/com/qs/serve/common/config/DevEnvironmentConfig.java

@ -1,23 +1,26 @@
package com.qs.serve.common.config;
import com.qs.serve.common.util.Assert;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
/**
* @author YenHex
* @since 2022/3/11
*/
@Slf4j
@UtilityClass
public class DevEnvironmentConfig {
private static Boolean devEnv = null;
public static void openDevEnv(Boolean open){
if(devEnv==null){devEnv = open;}
log.warn("环境变量:devEnv=>>> "+open);
devEnv = open;
}
public static boolean isDev(){
public static Boolean isDev(){
if(devEnv==null){
return false;
Assert.throwEx("资源加载中...");
}
return devEnv;
}

4
src/main/java/com/qs/serve/common/config/JwtConfig.java

@ -14,10 +14,10 @@ public class JwtConfig {
/**
* 单位分钟
*/
private final Integer expire = 60;
private final Integer expire = 7;
private final String iss = "KP_ISS";
private final String secret = "QiShenAa18n9VUcCxaSeSqLtFvsSCaRoVPKtBLaYxB0";
private final String secret = "QiShenAa18n9VUcCxaSeSqLtFvsSCaRoVPKtBLaYxB0123456";
}

3
src/main/java/com/qs/serve/common/config/MyBatisConfig.java

@ -45,7 +45,8 @@ public class MyBatisConfig {
"sys_tenant",
"wx_app",
"sys_menu",
"sys_menu_permit"
"sys_menu_permit",
"sys_request_log"
};
SysTenantHandler sysTenantHandler = new SysTenantHandler(ignoreTable);
return new TenantLineInnerInterceptor(sysTenantHandler);

23
src/main/java/com/qs/serve/common/config/SpringMvcConfig.java

@ -1,8 +1,10 @@
package com.qs.serve.common.config;
import com.qs.serve.common.framework.interceptor.ApiAuthInterceptor;
import com.qs.serve.common.config.properties.ProjectProperties;
import com.qs.serve.common.framework.interceptor.LimitSubmitInterceptor;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
@ -11,34 +13,37 @@ import org.springframework.web.filter.CorsFilter;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author YenHex
* @since 2022/2/24
*/
@Slf4j
@AllArgsConstructor
@Configuration(proxyBeanMethods = false)
public class SpringMvcConfig implements WebMvcConfigurer {
private final LimitSubmitInterceptor limitSubmitInterceptor;
private final ApiAuthInterceptor apiAuthInterceptor;
//private final ApiAuthInterceptor apiAuthInterceptor;
private final ProjectProperties projectProperties;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册LimitSubmitInterceptor拦截器
registry.addInterceptor(apiAuthInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/wx/login/*","/api/dev/**");
registry.addInterceptor(limitSubmitInterceptor)
.addPathPatterns("/**");
}
/*@Override
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
log.warn("PcWebLocal==>{}",projectProperties.getPcWebLocal());
registry.addResourceHandler("/web/**")
.addResourceLocations("file:"+projectProperties.getPcWebLocal());
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}*/
.addResourceLocations("file:"+projectProperties.getPcWebLocal()+"static/");
}
@Bean
public CorsFilter corsFilter() {

25
src/main/java/com/qs/serve/common/config/properties/AliYunOssProperties.java

@ -0,0 +1,25 @@
package com.qs.serve.common.config.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Author: YenHex
* @Date: 2021/3/3
* @Version: 1.0
**/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliYunOssProperties {
private String bucket;
private String accessKeyId;
private String accessKeySecret;
private String endpoint;
private String prefix;
}

36
src/main/java/com/qs/serve/common/config/properties/ProjectApisProperties.java

@ -0,0 +1,36 @@
package com.qs.serve.common.config.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author YenHex
* @since 2023/9/7
*/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "project.apis")
public class ProjectApisProperties {
/** 支付接口 */
private String costToPay;
/** 同步核销的支付状态 */
private String checkPayStatus;
/** 调度系统-发货单 */
private String diaoduPlanOrder;
/** 嘉士利接口,spu转换sku */
private String spuToSku;
/**
* 原是生成销路通apt的中间表替换伟成的接口直接生成
*/
private String policySyncCate;
private String policySyncInv;
}

25
src/main/java/com/qs/serve/common/config/properties/ProjectProperties.java

@ -0,0 +1,25 @@
package com.qs.serve.common.config.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Author: YenHex
* @Date: 2021/3/3
* @Version: 1.0
**/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "project")
public class ProjectProperties {
private String hostUrl;
private String webUrl;
private String pcWebLocal;
}

28
src/main/java/com/qs/serve/common/config/properties/SeeYonProperties.java

@ -0,0 +1,28 @@
package com.qs.serve.common.config.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: YenHex
* @Date: 2021/3/3
* @Version: 1.0
**/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "project.seeyon")
public class SeeYonProperties {
private Boolean enable;
private String url;
private String extApi;
}

4
src/main/java/com/qs/serve/common/framework/annotations/TagField.java

@ -0,0 +1,4 @@
package com.qs.serve.common.framework.annotations;
public @interface TagField {
}

5
src/main/java/com/qs/serve/common/framework/aop/SysLogAspect.java

@ -80,7 +80,12 @@ public class SysLogAspect {
if (controllerLog == null) {
return;
}
HttpServletRequest request = ServletUtils.getRequest();
//忽略GET
if(request.getMethod().equals("GET")){
return;
}
// 获取当前的用户
LoginUser loginUser = AuthContextUtils.getLoginUser(false);
SysOperationLog operLog = new SysOperationLog();

61
src/main/java/com/qs/serve/common/framework/exception/UnifiedExceptionHandler.java

@ -5,11 +5,13 @@ import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.HttpCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
@ -17,6 +19,7 @@ import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.sql.SQLIntegrityConstraintViolationException;
@ -33,13 +36,16 @@ public class UnifiedExceptionHandler {
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public R handleBindException(BusinessException e) {
public R handleBindException(BusinessException e,HttpServletRequest request) {
log.warn("自定义异常触发【{},{}】,请求地址:{}",e.getCode(),e.getMessage(),request.getRequestURI());
e.printStackTrace();
return new R(e.getCode(),e.getMessage());
}
@ExceptionHandler(value = NullPointerException.class)
@ResponseBody
public R handleBindException(NullPointerException e) {
public R handleBindException(NullPointerException e,HttpServletRequest request) {
log.error("空指针【{}】,请求地址:{}",e.getMessage(),request.getRequestURI());
e.printStackTrace();
return R.error("数据不存在或被移除");
}
@ -48,8 +54,9 @@ public class UnifiedExceptionHandler {
AccessDeniedException.class
})
@ResponseBody
public R handleAccessException(AccessDeniedException e) {
public R handleAccessException(AccessDeniedException e,HttpServletRequest request) {
HttpCode hc = HttpCode.FORBIDDEN_403;
log.error("访问拦截【{}】,请求地址:{}",e.getMessage(),request.getRequestURI());
return new R(hc.getCode(),hc.getMsg());
}
@ -73,27 +80,50 @@ public class UnifiedExceptionHandler {
@ExceptionHandler({
BindException.class,
MethodArgumentNotValidException.class,
HttpRequestMethodNotSupportedException.class
})
@ResponseBody
public R handleDevPrintMsgException(Exception e) {
log.warn("参数校验异常:{}",e.getMessage());
if(DevEnvironmentConfig.isDev()){return R.error(e.getMessage());}
public R handleDevPrintMsgException(Exception e,HttpServletRequest request) {
log.error("参数校验异常:{}",e.getMessage());
if(DevEnvironmentConfig.isDev()){
return R.error(e.getMessage());
}
return R.error();
}
@ExceptionHandler({
DuplicateKeyException.class,
MethodArgumentNotValidException.class,
})
@ResponseBody
public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e,HttpServletRequest request) {
log.error("参数校验异常【{}】,请求地址:{}",e.getMessage(),request.getRequestURI());
return R.error(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
}
@ExceptionHandler(value = DuplicateKeyException.class)
@ResponseBody
public R handleDuplicateKeyException(DuplicateKeyException e,HttpServletRequest request) {
log.error("限制重复数据【{}】,请求地址:{}",e.getMessage(),request.getRequestURI());
e.printStackTrace();
return R.error("限制重复数据,请联系管理员");
}
@ExceptionHandler(value = HttpMessageNotReadableException.class)
@ResponseBody
public R handleHttpMessageNotReadableException(HttpMessageNotReadableException e,HttpServletRequest request) {
log.error("请求参数无法解析【{}】,请求地址:{}",e.getMessage(),request.getRequestURI());
return R.error("请求参数无法解析");
}
@ExceptionHandler({
SQLIntegrityConstraintViolationException.class,
})
@ResponseBody
public R handleSqlIntegrityException(Exception e) {
String msg = e.getMessage();
public R handleSqlIntegrityException(Exception e,HttpServletRequest request) {
log.warn("数据库拦截【{}】,请求地址:{}",e.getMessage(),request.getRequestURI());
e.printStackTrace();
String[] tmps = msg.split("\\n");
String msg2 = tmps.length>1?tmps[1]:null;
return new R(500,"数据库拦截"+(msg2==null?"":" : "+msg2));
return new R(500,"数据库拦截,请联系管理员");
}
/**
@ -109,8 +139,9 @@ public class UnifiedExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public R handleException(Exception e) {
log.error("Servlet异常\n异常类型:{}\n异常信息:{}\n异常体:",e.getClass().getSimpleName(),e.getMessage(),e);
public R handleException(Exception e,HttpServletRequest request) {
log.error("Servlet异常\n请求地址:{},异常类型:{}\n异常信息:{}\n异常体:",request.getRequestURI(),e.getClass().getSimpleName(),e.getMessage(),e);
e.printStackTrace();
if(DevEnvironmentConfig.isDev()){return R.error(e.getMessage());}
return R.error();
}

60
src/main/java/com/qs/serve/common/framework/interceptor/ApiAuthInterceptor.java

@ -1,60 +0,0 @@
package com.qs.serve.common.framework.interceptor;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.framework.security.model.LoginUserDTO;
import com.qs.serve.common.model.consts.GySysConst;
import com.qs.serve.common.model.consts.RedisCacheKeys;
import com.qs.serve.common.util.JsonUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Objects;
/**
* API接口身份拦截器
* @author YenHex
*/
@Configuration(proxyBeanMethods = false)
public class ApiAuthInterceptor implements HandlerInterceptor {
@Resource private RedisService redisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader(GySysConst.APP_TOKEN_PROP);
String loginUserJson = redisService.getString(RedisCacheKeys.LOGIN_KEY_WX+token);
if(loginUserJson!=null){
LoginUser loginUser = Objects.requireNonNull(JsonUtil.jsonToPojo(loginUserJson, LoginUserDTO.class)).loginUser();
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
return true;
}
try {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "86400");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setStatus(200);
response.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
response.getWriter().print("{\"status\":401,\"msg\":\"用户信息无效或过期了\"}");
response.getWriter().flush();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}

286
src/main/java/com/qs/serve/common/framework/manager/AsyncFactory.java

@ -1,19 +1,49 @@
package com.qs.serve.common.framework.manager;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.config.DevEnvironmentConfig;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.JsonUtil;
import com.qs.serve.common.util.SpringUtils;
import com.qs.serve.modules.data.entity.DataAffairCommit;
import com.qs.serve.modules.data.service.DataAffairCommitService;
import com.qs.serve.modules.seeyon.service.SeeYonOperationService;
import com.qs.serve.modules.seeyon.service.SeeYonRequestService;
import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService;
import com.qs.serve.modules.sys.entity.SysOperationLog;
import com.qs.serve.modules.sys.mapper.SysOperationLogMapper;
import com.qs.serve.modules.tbs.entity.TbsBudget;
import com.qs.serve.modules.tbs.entity.TbsCostApply;
import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo;
import com.qs.serve.modules.tbs.service.impl.TbsBudgetApplyOperationServiceImpl;
import com.qs.serve.modules.tbs.service.impl.TbsBudgetBatchOperationServiceImpl;
import com.qs.serve.modules.tbs.service.impl.TbsBudgetChangeOperationServiceImpl;
import com.qs.serve.modules.tbs.service.impl.TbsCostApplyOperationServiceImpl;
import com.qs.serve.modules.tzc.service.impl.TzcPolicyOperationServiceImpl;
import com.qs.serve.modules.vtb.common.VtbVerificationState;
import com.qs.serve.modules.vtb.entity.VtbVerification;
import com.qs.serve.modules.vtb.service.VtbVerificationApplication;
import com.qs.serve.modules.vtb.service.VtbVerificationService;
import com.qs.serve.modules.vtb.service.impl.VtbVerificationOperationServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.scheduling.annotation.Async;
import java.math.BigDecimal;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_CUS_AMOUNT;
/**
* 异步工厂
* @author YenHex
* @since 2022/2/24
*/
@Slf4j
public class AsyncFactory {
/**
@ -25,12 +55,262 @@ public class AsyncFactory {
return new TimerTask() {
@Override
public void run() {
if(DevEnvironmentConfig.isDev()){
System.out.println(JsonUtil.objectToJson(operationLog));
}
SpringUtils.getBean(SysOperationLogMapper.class).saveLog(operationLog);
}
};
}
/**
* 异步保存政策状态
* @param userId
* @param supplierCode
* @return
*/
public static TimerTask initCustomerPrice(String userId,String supplierCode) {
return new TimerTask() {
@Override
public void run() {
getCumSurplusPrice(userId, supplierCode);
}
};
}
/**
* 获取客户帐余
* @param userId
* @param supplierCode
* @return
*/
public static String getCumSurplusPrice(String userId, String supplierCode) {
String lockKey = "customer_price_lock:"+userId+":"+supplierCode;
String priceDataKey = "customer_price_data:"+userId;
RedisService redisService = SpringUtils.getBean(RedisService.class);
redisService.set(lockKey,1,30,TimeUnit.SECONDS);
log.debug("获取客户金额,cusCode:{}",supplierCode);
//请求获取金额
SeeYonRequestBaseService seeYonRequestService = SpringUtils.getBean(SeeYonRequestBaseService.class);
R<String> reqResult = seeYonRequestService.getBase(ERP_CUS_AMOUNT+"?supplierCode="+supplierCode,"获取客户["+supplierCode+"]金额");
if(reqResult==null || !reqResult.getStatus().equals(200)){
//有错误退出
log.warn("获取客户金额失败,cusCode:{}",supplierCode);
redisService.set(lockKey,0);
return "-1";
}
String amount = reqResult.getData()==null?"0":reqResult.getData();
//数据格式:supplierCode_&_amount 如 A235654_&_612.00
String value = supplierCode+"_&_"+amount;
//缓存15分钟
log.debug("获取客户金额成功,cusCode:{},缓存15分钟",supplierCode);
redisService.set(priceDataKey,value,15, TimeUnit.MINUTES);
redisService.set(lockKey,0);
//
return amount;
}
/**
* 异步保存政策状态
* @param policyId
* @return
*/
public static TimerTask submitPolicy(Long policyId) {
return new TimerTask() {
@Override
public void run() {
TzcPolicyOperationServiceImpl operationService = SpringUtils.getBean(TzcPolicyOperationServiceImpl.class);
RedisService redisService = SpringUtils.getBean(RedisService.class);
boolean createLock = redisService.tryToLock(operationService.getTemplateCode(),policyId+"");
if(createLock){
try {
log.debug("--------------------------SubmitPolicy CallbackTimer Sleep Start------------------------------");
AuthContextUtils.setTenant("001");
Thread.sleep(3*1000);
String summeryResult = operationService.checkAffairSummery(policyId.toString());
if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){
//调用成功回调方法
TbsAffairCommitBo finishedParam = new TbsAffairCommitBo();
finishedParam.setPolicyId(policyId);
operationService.doFinished(finishedParam);
}
log.debug("--------------------------SubmitPolicy CallbackTimer summeryResult:{}------------------------------",summeryResult);
} catch (Exception e) {
e.printStackTrace();
}finally {
redisService.removeLock(operationService.getTemplateCode(),policyId+"");
}
}
}
};
}
/**
* 异步保存费用申请状态
* @param budgetId
* @return
*/
public static TimerTask submitBudgetChange(String budgetId) {
return new TimerTask() {
@Override
public void run() {
try {
AuthContextUtils.setTenant("001");
log.debug("--------------------------SubmitBudgetApply CallbackTimer Sleep Start :{}------------------------------",budgetId);
Thread.sleep(3*1000);
TbsBudgetChangeOperationServiceImpl applyOperationService = SpringUtils.getBean(TbsBudgetChangeOperationServiceImpl.class);
String summeryResult = applyOperationService.checkAffairSummery(budgetId);
if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){
TbsAffairCommitBo doParam = new TbsAffairCommitBo();
doParam.setTargetId(budgetId);
applyOperationService.doFinished(doParam);
}
log.debug("--------------------------SubmitBudgetApply CallbackTimer summeryResult:{} ------------------------------",summeryResult);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
/**
* 异步保存费用申请状态
* @param batchId
* @return
*/
public static TimerTask submitBudgetBatch(String batchId) {
return new TimerTask() {
@Override
public void run() {
try {
AuthContextUtils.setTenant("001");
log.debug("--------------------------SubmitBudgetApply CallbackTimer Sleep Start------------------------------");
Thread.sleep(7*1000);
TbsBudgetBatchOperationServiceImpl operationService = SpringUtils.getBean(TbsBudgetBatchOperationServiceImpl.class);
String summeryResult = operationService.checkAffairSummery(batchId);
if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){
TbsAffairCommitBo doParam = new TbsAffairCommitBo();
doParam.setTargetId(batchId);
operationService.doFinished(doParam);
}
log.debug("--------------------------SubmitBudgetApply CallbackTimer summeryResult:{} ------------------------------",summeryResult);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
/**
* 异步保存费用申请状态
* @param budgetId
* @return
*/
public static TimerTask submitBudgetApply(String budgetId) {
return new TimerTask() {
@Override
public void run() {
try {
AuthContextUtils.setTenant("001");
log.debug("--------------------------submitBudgetApply CallbackTimer Sleep Start :{}------------------------------",budgetId);
Thread.sleep(3*1000);
TbsBudgetApplyOperationServiceImpl applyOperationService = SpringUtils.getBean(TbsBudgetApplyOperationServiceImpl.class);
String summeryResult = applyOperationService.checkAffairSummery(budgetId);
if(summeryResult.equals(TzcPolicyOperationServiceImpl.SummeryState_Success)){
TbsAffairCommitBo doParam = new TbsAffairCommitBo();
doParam.setTargetId(budgetId);
applyOperationService.doFinished(doParam);
}
log.debug("--------------------------SubmitBudgetApply CallbackTimer summeryResult:{} ------------------------------",summeryResult);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
/**
* 异步保存费用申请状态
* @param costApply
* @return
*/
public static TimerTask submitCostApply(TbsCostApply costApply) {
return new TimerTask() {
@Override
public void run() {
try {
AuthContextUtils.setTenant("001");
log.debug("--------------------------SubmitCostApply CallbackTimer Sleep Start------------------------------");
Thread.sleep(7*1000);
TbsCostApplyOperationServiceImpl applyOperationService = SpringUtils.getBean(TbsCostApplyOperationServiceImpl.class);
String summeryResult = applyOperationService.checkAffairSummery(costApply.getId().toString());
if(summeryResult.equals(TbsCostApplyOperationServiceImpl.SummeryState_Success)){
//调用成功回调方法
TbsAffairCommitBo finishedParam = new TbsAffairCommitBo();
finishedParam.setCostApplyId(costApply.getId());
applyOperationService.doFinished(finishedParam);
}
log.debug("--------------------------SubmitCostApply CallbackTimer summeryResult:{} ------------------------------",summeryResult);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
/**
* 异步保存核销状态
* @param verificationId
* @param totalAmount
* @return
*/
public static TimerTask saveVtbSubmit(String userCode,Long verificationId, BigDecimal totalAmount,boolean realaseFlag) {
log.warn("费用释放---verificationId:{} totalAmount:{} realaseFlag:{}",verificationId,totalAmount,realaseFlag);
return new TimerTask() {
@Override
public void run() {
try {
AuthContextUtils.setTenant("001");
Thread.sleep(3*1000);
VtbVerificationService vtbVerificationService = SpringUtils.getBean(VtbVerificationService.class);
VtbVerification verification = vtbVerificationService.getById(verificationId);
if(!verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){
return;
}
VtbVerificationOperationServiceImpl verificationOperationService = SpringUtils.getBean(VtbVerificationOperationServiceImpl.class);
String summeryResult = verificationOperationService.checkAffairSummery(verification.getId().toString());
if(summeryResult.equals(TbsCostApplyOperationServiceImpl.SummeryState_Success)){
DataAffairCommitService commitService = SpringUtils.getBean(DataAffairCommitService.class);
// TbsAffairCommitBo.state 0-否定,1-同意,2-退回
Integer state = commitService.getState(verificationOperationService.getTemplateCode(),verificationId+"");
VtbVerificationApplication verificationApplication = SpringUtils.getBean(VtbVerificationApplication.class);
if(state.equals(1)){
//调用成功回调方法
verificationApplication.finishCallBack(verification, totalAmount);
}else if(state.equals(2)){
verificationApplication.backCommitAndStop(verification,true);
}else if(state.equals(0)){
verificationApplication.backCommitAndStop(verification,false);
}else {
return;
}
if(realaseFlag){
vtbVerificationService.release(verification.getActivityId(),userCode,false);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
}

40
src/main/java/com/qs/serve/common/framework/mvc/HttpServletRequestFilter.java

@ -1,5 +1,6 @@
package com.qs.serve.common.framework.mvc;
import com.qs.serve.common.config.DevEnvironmentConfig;
import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.DateUtils;
@ -18,6 +19,8 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* HttpServletRequest 过滤器
@ -59,31 +62,42 @@ public class HttpServletRequestFilter implements Filter{
double diffTime = DateUtils.diffTime(startTime,endTime);
assert servletRequest instanceof HttpServletRequest;
HttpServletRequest request = (HttpServletRequest)servletRequest;
String tenant = request.getHeader("tenant-id");
String supplierId = request.getHeader("supplierId");
String url = request.getRequestURL().toString();
String method = request.getMethod();
String queryStr = request.getQueryString();
String reqBody = "";
if (ServletUtils.isJsonRequest(request)) {
if (ServletUtils.isJsonRequest(request)&&requestWrapper!=null) {
reqBody = requestWrapper.getBody();
}
StringBuffer buffer = new StringBuffer("["+method+"] "+url + " IP: "+ServletUtils.getIp(request));
buffer.append("\n校区编号: "+tenant);
StringBuffer buffer = new StringBuffer("\n["+method+"] "+url);
if(supplierId!=null){
buffer.append(" 供应商ID: "+supplierId);
}
if(!StringUtils.isEmpty(queryStr)){
buffer.append("\n参数: "+queryStr);
}
if(DevEnvironmentConfig.isDev() &&!StringUtils.isEmpty(reqBody)){
buffer.append("\n请求体: "+reqBody);
}
if(diffTime>0.6D){
buffer.append("\n耗时: "+diffTime+"秒");
}
try {
LoginUser loginUser = AuthContextUtils.getLoginUser(false);
if(loginUser!=null){
buffer.append("\n用户类型: "+ loginUser.getTypeFlag().getName()+" 用户ID: "+loginUser.getUserId());
buffer.append("\n用户: "+loginUser.getNick());
buffer.append(" IP:["+ServletUtils.getIp(request)+"]");
buffer.append(" 时间:["+ LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)+"]");
}
} catch (Exception e) {}
if(!StringUtils.isEmpty(queryStr)){
buffer.append("\n参数: "+queryStr);
}
if(!StringUtils.isEmpty(reqBody)){
buffer.append("\n请求体: "+reqBody);
if(diffTime< 1D){
log.debug(buffer.toString());
}else if (diffTime< 20D){
log.warn(buffer.toString());
}else {
log.error(buffer.toString());
}
buffer.append("\n耗时: "+diffTime+"秒");
/*if(diffTime>4){ log.warn("访问速度:{}秒,接口:{},参数:{},请求体:{}",diffTime,"["+method+"] "+url,queryStr,reqBody);}*/
System.out.println(buffer);
}
@Override

51
src/main/java/com/qs/serve/common/framework/redis/RedisService.java

@ -1,7 +1,13 @@
package com.qs.serve.common.framework.redis;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.*;
@ -15,6 +21,15 @@ import java.util.concurrent.TimeUnit;
@AllArgsConstructor
public class RedisService {
@Bean
@Primary
public RedisCacheManager selfCacheManager(RedisTemplate<String, Object> redisTemplate) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
return new TtlRedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
private RedisTemplate redisTemplate;
private StringRedisTemplate stringRedisTemplate;
@ -212,6 +227,14 @@ public class RedisService {
return null;
}
public Long getLong(final String key) {
String result = getString(key);
if(result!=null){
return Long.parseLong(result);
}
return null;
}
/**
* 哈希 添加
*
@ -306,4 +329,32 @@ public class RedisService {
ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
return zset.rangeByScore(key, scoure, scoure1);
}
/**
* 移除业务锁
* @param code
* @param targetId
*/
public void removeLock(String code,String targetId){
String key = "lock_commit:"+code+":"+targetId;
this.remove(key);
}
/**
*
* @param code
* @param targetId
* @return true--新建锁成功false反之
*/
public boolean tryToLock(String code,String targetId){
String key = "lock_commit:"+code+":"+targetId;
Integer existState = getInteger(key);
if(existState==null){
this.set(key,1,20,TimeUnit.SECONDS);
return true;
}else {
return false;
}
}
}

30
src/main/java/com/qs/serve/common/framework/redis/TtlRedisCacheManager.java

@ -0,0 +1,30 @@
package com.qs.serve.common.framework.redis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.cache.RedisCache;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.util.StringUtils;
import java.time.Duration;
@Slf4j
public class TtlRedisCacheManager extends RedisCacheManager {
public TtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
super(cacheWriter, defaultCacheConfiguration);
}
@Override
protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
log.debug("TtlRedisCacheManager keyName:{}",name);
String[] cells = StringUtils.delimitedListToStringArray(name, "=");
name = cells[0];
if (cells.length > 1) {
long ttl = Long.parseLong(cells[1]);
// 根据传参设置缓存失效时间,默认单位是秒
cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl));
}
return super.createRedisCache(name, cacheConfig);
}
}

32
src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java

@ -3,10 +3,13 @@ package com.qs.serve.common.framework.security.filter;
import com.qs.serve.common.config.DevEnvironmentConfig;
import com.qs.serve.common.config.properties.PermitProperties;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.framework.security.model.LoginUserDTO;
import com.qs.serve.common.framework.security.model.LoginUserType;
import com.qs.serve.common.model.HttpResponsePrintUtil;
import com.qs.serve.common.model.consts.GySysConst;
import com.qs.serve.common.model.consts.RedisCacheKeys;
import com.qs.serve.common.util.JsonUtil;
import com.qs.serve.common.util.JwtUtils;
import com.qs.serve.common.framework.security.util.SecurityPermitUtil;
import com.qs.serve.common.util.AuthContextUtils;
@ -27,6 +30,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Objects;
/**
* 判断token情况
@ -52,6 +56,9 @@ public class SecurityRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
String supplierId = request.getHeader(GySysConst.SUPPLIER_PROP);
AuthContextUtils.setSupplierId(supplierId);
//移除前缀
String url = request.getRequestURI();
if(!StringUtils.isEmpty(contextPath)&&!contextPath.equals("/")){
@ -103,19 +110,14 @@ public class SecurityRequestFilter extends OncePerRequestFilter {
* @throws ServletException
*/
private void tryDoSecurityAuthor(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String tenant = request.getHeader(GySysConst.TENANT_PROP);
String token = request.getHeader(GySysConst.AUTHORIZATION_PROP);
if(tenant!=null&&token!=null&&JwtUtils.verify(token)){
String userId = JwtUtils.getUserId(token);
String userType = JwtUtils.getUserType(token);
AuthContextUtils.setTenant(tenant);
if(SecurityContextHolder.getContext().getAuthentication()==null){
UserDetails userDetails = null;
if(userType.equals(LoginUserType.SYS_USER.getCode())
||userType.equals(LoginUserType.SYS_SUP_USER.getCode())){
//后台管理员登录
userDetails = sysUserService.getLoginUserById(userId);
}
UserDetails userDetails = sysUserService.getLoginUserById(userId);
if(userDetails!=null){
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
@ -144,19 +146,14 @@ public class SecurityRequestFilter extends OncePerRequestFilter {
String client = JwtUtils.getClient(token);
String redisKey = com.qs.serve.common.util.StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,userId);
String cacheToken = redisService.getString(redisKey);
if(!DevEnvironmentConfig.isDev()&&!token.equals(cacheToken)){
redisService.remove(redisKey);
HttpResponsePrintUtil.print2(response,401,"异地登录,已被系统登出");
if(cacheToken==null){
//redisService.remove(redisKey);
HttpResponsePrintUtil.print2(response,401,"已被系统登出");
//return解决:security.access.AccessDeniedException
return;
}
if(SecurityContextHolder.getContext().getAuthentication()==null){
UserDetails userDetails = null;
if(userType.equals(LoginUserType.SYS_USER.getCode())
||userType.equals(LoginUserType.SYS_SUP_USER.getCode())){
//后台管理员登录
userDetails = sysUserService.getLoginUserById(userId);
}
UserDetails userDetails = sysUserService.getLoginUserById(userId);
if(userDetails==null){
HttpResponsePrintUtil.print2(response,401,"登录信息无效,请重新登录");
//return解决:security.access.AccessDeniedException
@ -184,7 +181,8 @@ public class SecurityRequestFilter extends OncePerRequestFilter {
AuthContextUtils.setTenant(tenant);
return true;
}else{
HttpResponsePrintUtil.print2(response,4001,"校区信息错误");
log.error("商户信息错误,请求地址:{}",request.getRequestURI());
HttpResponsePrintUtil.print2(response,4001,"商户信息错误");
return false;
}
}

18
src/main/java/com/qs/serve/common/model/AmountDTO.java

@ -0,0 +1,18 @@
package com.qs.serve.common.model;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author YenHex
* @since 2023/7/31
*/
@Data
public class AmountDTO {
private String id;
private BigDecimal amount;
}

20
src/main/java/com/qs/serve/common/model/annotation/BusinessDifference.java

@ -0,0 +1,20 @@
package com.qs.serve.common.model.annotation;
import java.lang.annotation.*;
/**
* @author YenHex
* @since 2023/4/25
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BusinessDifference {
/**
* 字段备注
* @return
*/
String value() default "";
}

19
src/main/java/com/qs/serve/common/model/chart/BiCommonCounter.java

@ -0,0 +1,19 @@
package com.qs.serve.common.model.chart;
import lombok.Data;
/**
* @author YenHex
* @since 2023/6/7
*/
@Data
public class BiCommonCounter {
/**
* 横轴下标的ID
*/
private String label;
private Long counts;
}

15
src/main/java/com/qs/serve/common/model/chart/BiMonthCounter.java

@ -0,0 +1,15 @@
package com.qs.serve.common.model.chart;
import lombok.Data;
/**
* @author YenHex
* @since 2023/6/7
*/
@Data
public class BiMonthCounter {
private String months;
private Long counts;
}

39
src/main/java/com/qs/serve/common/model/chart/ChartAxisColumn.java

@ -0,0 +1,39 @@
package com.qs.serve.common.model.chart;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @author YenHex
* @since 2023/6/7
*/
@Data
public class ChartAxisColumn {
/** 列Id */
String columnId;
/** 列名 */
String columnName;
/** 系列坐标值合计 */
Double total;
public static List<ChartAxisColumn> buildMonthsOfYear(){
List<ChartAxisColumn> axisColumnList = new ArrayList<>();
for (long i = 1; i < 13; i++) {
ChartAxisColumn axisColumn = new ChartAxisColumn();
if(i>9){
axisColumn.setColumnId(i+"");
}else {
axisColumn.setColumnId("0"+i);
}
axisColumn.setColumnName(i+"月");
axisColumnList.add(axisColumn);
}
return axisColumnList;
}
}

148
src/main/java/com/qs/serve/common/model/chart/ChartDataVo.java

@ -0,0 +1,148 @@
package com.qs.serve.common.model.chart;
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author YenHex
* @since 2023/6/7
*/
@Data
public class ChartDataVo {
/**
* 饼状图的主要参数
*/
List<ChartAxisColumn> axisColumnList;
/**
* 系列
*/
List<ChartSeriesItem> seriesItemList;
/**
* 分组
*/
List<ChartGroupItem> groupItemList;
public void initAxisColumnTotal(){
for (int i = 0; i < axisColumnList.size(); i++) {
ChartAxisColumn axisColumn = axisColumnList.get(i);
BigDecimal total = BigDecimal.ZERO;
if(seriesItemList!=null&&seriesItemList.size()>0){
for (ChartSeriesItem seriesItem : seriesItemList) {
double value = seriesItem.getValues().get(i);
total = total.add(new BigDecimal(value+""));
}
}
axisColumn.setTotal(total.doubleValue());
}
}
public static ChartDataVo buildStateChartData(List<BiCommonCounter> stateCounterList, Map<String,String> stateMap){
ChartDataVo chartDataVo = new ChartDataVo();
List<ChartAxisColumn> axisColumnList = new ArrayList<>();
List<ChartSeriesItem> seriesItemList = new ArrayList<>();
List<ChartGroupItem> groupItemList = new ArrayList<>();
ChartGroupItem groupItem = new ChartGroupItem();
groupItem.setGroupId(100L);
groupItem.setGroupName("默认");
groupItemList.add(groupItem);
for (String stateNum : stateMap.keySet()) {
String label = stateMap.get(stateNum);
ChartAxisColumn axisColumn = new ChartAxisColumn();
axisColumn.setColumnId(stateNum);
axisColumn.setColumnName(label);
axisColumnList.add(axisColumn);
}
List<Double> values = new ArrayList<>();
for (ChartAxisColumn chartAxisColumn : axisColumnList) {
Double currVal = 0.0;
for (BiCommonCounter counter : stateCounterList) {
if(chartAxisColumn.getColumnId().equals(counter.getLabel())){
currVal = counter.getCounts().doubleValue();
break;
}
}
values.add(currVal);
}
ChartSeriesItem seriesItem = new ChartSeriesItem();
seriesItem.setGroupId(groupItem.getGroupId());
seriesItem.setGroupName(groupItem.getGroupName());
seriesItem.setValues(values);
seriesItemList.add(seriesItem);
//更新total
chartDataVo.setAxisColumnList(axisColumnList);
chartDataVo.setGroupItemList(groupItemList);
chartDataVo.setSeriesItemList(seriesItemList);
chartDataVo.initAxisColumnTotal();
return chartDataVo;
}
public void tes(){
}
public void buildStateMap(Map<String,String> stateMap){
init();
for (String stateNum : stateMap.keySet()) {
String label = stateMap.get(stateNum);
ChartAxisColumn axisColumn = new ChartAxisColumn();
axisColumn.setColumnId(stateNum);
axisColumn.setColumnName(label);
this.axisColumnList.add(axisColumn);
}
}
public void buildStateMapOfMonths(){
init();
this.axisColumnList = ChartAxisColumn.buildMonthsOfYear();
}
/**
* 先调用buildStateMap
* @param groupId
* @param groupName
* @param stateCounterList
*/
public void addData(Long groupId,String groupName,List<BiCommonCounter> stateCounterList){
ChartGroupItem groupItem = new ChartGroupItem();
groupItem.setGroupId(groupId);
groupItem.setGroupName(groupName);
groupItemList.add(groupItem);
List<Double> values = new ArrayList<>();
for (ChartAxisColumn chartAxisColumn : axisColumnList) {
Double currVal = 0.0;
for (BiCommonCounter counter : stateCounterList) {
if(chartAxisColumn.getColumnId().equals(counter.getLabel())){
currVal = counter.getCounts().doubleValue();
break;
}
}
values.add(currVal);
}
ChartSeriesItem seriesItem = new ChartSeriesItem();
seriesItem.setGroupId(groupItem.getGroupId());
seriesItem.setGroupName(groupItem.getGroupName());
seriesItem.setValues(values);
seriesItemList.add(seriesItem);
this.initAxisColumnTotal();
}
private void init(){
if(axisColumnList==null){
axisColumnList = new ArrayList<>();
}
if(seriesItemList==null){
seriesItemList = new ArrayList<>();
}
if(groupItemList==null){
groupItemList = new ArrayList<>();
}
}
}

18
src/main/java/com/qs/serve/common/model/chart/ChartGroupItem.java

@ -0,0 +1,18 @@
package com.qs.serve.common.model.chart;
import lombok.Data;
/**
* @author YenHex
* @since 2023/6/7
*/
@Data
public class ChartGroupItem {
/** 组id */
private Long groupId;
/** 组名 */
private String groupName;
}

26
src/main/java/com/qs/serve/common/model/chart/ChartSeriesItem.java

@ -0,0 +1,26 @@
package com.qs.serve.common.model.chart;
import lombok.Data;
import java.util.List;
/**
* @author YenHex
* @since 2023/6/7
*/
@Data
public class ChartSeriesItem {
/** 组id */
Long groupId;
/** 组名 */
String groupName;
/**
* 值列表(列对应axisColumns)
*/
List<Double> values;
}

75
src/main/java/com/qs/serve/common/model/chart/PrintChart.java

@ -0,0 +1,75 @@
package com.qs.serve.common.model.chart;
import com.qs.serve.common.util.JsonUtil;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @author YenHex
* @since 2023/2/17
*/
public class PrintChart {
public static void main(String[] args) {
//eg. 统计最近5年入学人数,并区分男女数量
ChartDataVo chartDataVo = new ChartDataVo();
List<ChartAxisColumn> axisColumnList = new ArrayList<>();
List<ChartSeriesItem> seriesItemList = new ArrayList<>();
List<ChartGroupItem> groupItemList = new ArrayList<>();
ChartGroupItem groupItem = new ChartGroupItem();
groupItem.setGroupId(100L);
groupItem.setGroupName("男学生");
groupItemList.add(groupItem);
ChartGroupItem groupItem2 = new ChartGroupItem();
groupItem2.setGroupId(200L);
groupItem2.setGroupName("女学生");
groupItemList.add(groupItem2);
for (long i = 1; i <= 5; i++) {
ChartAxisColumn axisColumn = new ChartAxisColumn();
axisColumn.setColumnId(i+"");
axisColumn.setColumnName("202"+i+"年");
axisColumnList.add(axisColumn);
}
Random random = new Random();
for (ChartGroupItem chartGroupItem : groupItemList) {
ChartSeriesItem seriesItem = new ChartSeriesItem();
seriesItem.setGroupId(chartGroupItem.getGroupId());
seriesItem.setGroupName(chartGroupItem.getGroupName());
List<Double> values = new ArrayList<>();
for (int i = 0; i < axisColumnList.size(); i++) {
double result = random.nextInt(1000)+3000;
values.add(result);
}
seriesItem.setValues(values);
seriesItemList.add(seriesItem);
}
//更新total
for (int i = 0; i < axisColumnList.size(); i++) {
ChartAxisColumn axisColumn = axisColumnList.get(i);
BigDecimal total = BigDecimal.ZERO;
for (ChartSeriesItem seriesItem : seriesItemList) {
double value = seriesItem.getValues().get(i);
total = total.add(new BigDecimal(value+""));
}
axisColumn.setTotal(total.doubleValue());
}
chartDataVo.setAxisColumnList(axisColumnList);
chartDataVo.setGroupItemList(groupItemList);
chartDataVo.setSeriesItemList(seriesItemList);
String v = JsonUtil.objectToJson(chartDataVo);
System.out.println(v);
}
}

13
src/main/java/com/qs/serve/common/model/consts/ApplyTypeConst.java

@ -0,0 +1,13 @@
package com.qs.serve.common.model.consts;
/**
* @author YenHex
* @since 2023/9/19
*/
public interface ApplyTypeConst {
String CostBill = "CostBill";
String CheckCost = "CheckCost";
String ReleasePolicy = "ReleasePolicy";
}

21
src/main/java/com/qs/serve/common/model/consts/BudgetLogRollbackFlag.java

@ -0,0 +1,21 @@
package com.qs.serve.common.model.consts;
/**
* @author YenHex
* @since 2023/1/30
*/
public interface BudgetLogRollbackFlag {
/** 正常(标记为最新记录) */
Integer State_0 = 0;
/** 回退 */
Integer State_1 = 1;
/** 回退已处理 */
Integer State_2 = 2;
/** 删除已处理 */
Integer State_3 = 3;
}

1
src/main/java/com/qs/serve/common/model/consts/GySysConst.java

@ -17,6 +17,7 @@ public class GySysConst {
public static final String USER_AGENT_PROP = "User-Agent";
public static final String TENANT_PROP = "tenant-id";
public static final String SUPPLIER_PROP = "supplierId";
/** 系统租户数据库列 */
public static final String TENANT_COLUMN = "tenant_id";

19
src/main/java/com/qs/serve/common/model/consts/RedisCacheKeys.java

@ -6,25 +6,28 @@ package com.qs.serve.common.model.consts;
*/
public class RedisCacheKeys {
/** 权限列表 */
public final static String PERMIT_ALL_LIST = "expire_permit_list";
public final static String SUPPLIER_RELATE_TREE = "supplier_relate_tree";
/** 租户列表 */
public final static String Tenant_ALL_LIST = "expire_tenant_list";
/** 管理员登录key */
public final static String LOGIN_KEY_ADMIN = "login_admin_:";
/** 家长登录key */
public final static String LOGIN_KEY_WX = "login_wx_:";
/** 用户登录APP {}客户端 {}用户ID */
public final static String LOGIN_KEY_APP = "login_app_{}:{}:";
/** 微信用户ID */
public final static String WX_KEY_USER = "wx_usr_id:{}:";
/** 手机号验证吗 */
public final static String PHONE_KEY = "phone_code_:";
/** 工号标识 */
public final static String SYS_USER_CODE_KEY = "sys_user_code_:";
/**
* 0-无需操作
* 1-未处理
* 2-同步中
* 3-同步完成但未更新表
*/
public final static String HIS_UPDATE = "update_his_flag:";
}

12
src/main/java/com/qs/serve/common/model/consts/ResultFlag.java

@ -0,0 +1,12 @@
package com.qs.serve.common.model.consts;
/**
* @author YenHex
* @since 2023/2/15
*/
public interface ResultFlag {
int OK = 1;
int NOT = 0;
}

17
src/main/java/com/qs/serve/common/model/consts/SysConfigKey.java

@ -0,0 +1,17 @@
package com.qs.serve.common.model.consts;
/**
* 系统配置
* @author YenHex
* @since 2022/11/12
*/
public interface SysConfigKey {
/** 费用超支 */
String TbsBudgetOverspend = "TbsBudgetOverspend";
/** 活动预计核销日期 */
String ActivityPreCheckDays = "ActivityPreCheckDays";
String DateCheckApplyExcelYear = "DateCheckApplyExcelYear";
}

29
src/main/java/com/qs/serve/common/model/dto/DateSplitDTO.java

@ -0,0 +1,29 @@
package com.qs.serve.common.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.util.Date;
/**
* @author YenHex
* @since 2023/6/5
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DateSplitDTO {
Integer days;
LocalDate startDate;
LocalDate endDate;
Integer yearMonth;
Integer sort;
}

17
src/main/java/com/qs/serve/common/model/dto/DiffFieldVal.java

@ -0,0 +1,17 @@
package com.qs.serve.common.model.dto;
import lombok.Data;
/**
* @author YenHex
* @since 2023/4/25
*/
@Data
public class DiffFieldVal {
String field;
String comment;
String orgValue;
String newValue;
}

27
src/main/java/com/qs/serve/common/model/dto/HeaderOption.java

@ -0,0 +1,27 @@
package com.qs.serve.common.model.dto;
import com.qs.serve.common.util.PageUtil;
import lombok.Data;
import java.util.List;
/**
* @author YenHex
* @since 2023/5/17
*/
@Data
public class HeaderOption {
private String name;
// private String width;
// private String prefix;
// private String suffix;
private Boolean isSum;
private Integer decimalLength;
private String align;
private List<HeaderOption> children;
public HeaderOption(String name){
this.name = name;
}
}

10
src/main/java/com/qs/serve/common/model/dto/PageVo.java

@ -43,4 +43,14 @@ public class PageVo<T>{
this.totalPage = total%pageSize==0?total/pageSize:(total/pageSize+1);
}
public static <TYPE,R_TYPE> PageVo<R_TYPE> initNewList(PageVo<TYPE> oldVo,List<R_TYPE> list){
PageVo<R_TYPE> newVo = new PageVo<>();
newVo.setPageNum(oldVo.getPageNum());
newVo.setPageSize(oldVo.getPageSize());
newVo.setTotal(oldVo.getTotal());
newVo.setTotalPage(oldVo.getTotalPage());
newVo.setList(list);
return newVo;
}
}

50
src/main/java/com/qs/serve/common/model/dto/R.java

@ -116,10 +116,19 @@ public class R<T> implements Serializable {
return new R<>(FAILED_STATUS,message,null);
}
public static <TYPE> R<TYPE> error(String message,TYPE data) {
return new R<>(FAILED_STATUS,FAILED_TIPS,data);
}
public static R error() {
return new R<>(FAILED_STATUS,FAILED_TIPS,null);
}
public static R errorNotFound() {
return new R<>(FAILED_STATUS,NOT_FOUND_TIPS,null);
}
public static R error2() {
return new R<>(FAILED_STATUS,FAILED_TIPS_2,null);
}
@ -139,6 +148,10 @@ public class R<T> implements Serializable {
}
public static <TYPE> R<PageVo<TYPE>> byPageHelperList(List<TYPE> data){
return R.ok(buildPageHelperList(data));
}
public static <TYPE> PageVo<TYPE> buildPageHelperList(List<TYPE> data){
PageVo<TYPE> pageVo = new PageVo<>();
PageInfo<TYPE> pageInfo = new PageInfo<>(data);
pageVo.setPageSize(pageInfo.getPageSize());
@ -146,7 +159,18 @@ public class R<T> implements Serializable {
pageVo.setTotal(pageInfo.getTotal());
pageVo.setList(data);
pageVo.setTotalPage(new Long(pageInfo.getPages()));
return R.ok(pageVo);
return pageVo;
}
public static <TYPE,R_TYPE> PageVo<R_TYPE> buildPageHelperList(List<TYPE> sources,List<R_TYPE> details){
PageVo<R_TYPE> pageVo = new PageVo<>();
PageInfo<TYPE> pageInfo = new PageInfo<>(sources);
pageVo.setPageSize(pageInfo.getPageSize());
pageVo.setPageNum(pageInfo.getPageNum());
pageVo.setTotal(pageInfo.getTotal());
pageVo.setList(details);
pageVo.setTotalPage(new Long(pageInfo.getPages()));
return pageVo;
}
public static <TYPE> R<PageVo<TYPE>> byEmptyList(){
@ -170,4 +194,26 @@ public class R<T> implements Serializable {
return R.ok(pageVo);
}
public static <TYPE> R<PageVo<TYPE>> byPageList(Integer pageNum,Integer pageSize,Long total,List<TYPE> data){
PageVo<TYPE> pageVo = new PageVo<>();
pageVo.setPageSize(pageSize);
pageVo.setPageNum(pageNum);
pageVo.setTotal(total);
pageVo.setList(data);
pageVo.setTotalPage(total%pageSize==0?total/pageSize:total/pageSize+1);
return R.ok(pageVo);
}
public static <TYPE> R<PageVo<TYPE>> byPageList(Long total,List<TYPE> data){
Integer pageNum = PageUtil.getPageNum();
Integer pageSize = PageUtil.getPageSize();
PageVo<TYPE> pageVo = new PageVo<>();
pageVo.setPageSize(pageSize);
pageVo.setPageNum(pageNum);
pageVo.setTotal(total);
pageVo.setList(data);
pageVo.setTotalPage(total%pageSize==0?total/pageSize:total/pageSize+1);
return R.ok(pageVo);
}
}

26
src/main/java/com/qs/serve/common/model/dto/RowParam.java

@ -0,0 +1,26 @@
package com.qs.serve.common.model.dto;
import com.qs.serve.common.util.PageUtil;
import lombok.Data;
/**
* @author YenHex
* @since 2023/5/17
*/
@Data
public class RowParam {
private Integer startIndex;
private Integer size;
public RowParam(Integer startIndex, Integer size) {
this.startIndex = startIndex;
this.size = size;
}
public RowParam(boolean pageable) {
this.size = PageUtil.getPageSize();
this.startIndex = (PageUtil.getPageNum()-1)*size;
}
}

29
src/main/java/com/qs/serve/common/model/dto/TargetDTO.java

@ -0,0 +1,29 @@
package com.qs.serve.common.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author YenHex
* @since 2023/4/7
*/
@Data
@AllArgsConstructor
public class TargetDTO {
String targetId;
String targetCode;
String targetName;
public TargetDTO(String targetId, String targetCode, String targetName) {
this.targetId = targetId;
this.targetCode = targetCode;
this.targetName = targetName;
}
//拜访相关业务
String localX;
String localY;
String address;
String mapAddress;
}

17
src/main/java/com/qs/serve/common/model/dto/TargetObjectDTO.java

@ -0,0 +1,17 @@
package com.qs.serve.common.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author YenHex
* @since 2023/4/7
*/
@Data
public class TargetObjectDTO {
String targetType;
String targetId;
String targetCode;
String targetName;
}

2
src/main/java/com/qs/serve/common/model/dto/TreeNode.java

@ -22,7 +22,7 @@ public class TreeNode {
}
public List<TreeNode> getChildren() {
if(children.size()<=0){
if(children==null||children.size()<=0){
return null;
}
return children;

3
src/main/java/com/qs/serve/common/model/enums/BizType.java

@ -43,6 +43,9 @@ public enum BizType {
QUERY("查询"),
LEAVE("离职"),
EXPORT("导出"),
RESET("重置");
String value;

91
src/main/java/com/qs/serve/common/model/enums/BudgetLogOptFlag.java

@ -0,0 +1,91 @@
package com.qs.serve.common.model.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author YenHex
* @since 2023/1/30
*/
@Getter
@AllArgsConstructor
public enum BudgetLogOptFlag {
/** 0-预算新增 */
State_0(0,true),
/** 1-费用申请(费用申请,预算调减) */
State_1(1,false),
/** 2-预算调增 */
State_2(2,true),
/** 3-预算调减 */
State_3(3,false),
/** 4-费用释放(预算调增) */
State_4(4,true),
/** 5-费用申请调增(费用申请,预算调增) */
State_5(5,true),
/** 6-费用申请调减(费用申请,预算调减) */
State_6(6,false),
/** 已取消 7-销售区域迁移调增 */
State_7(7,false),
/** 已取消 8-销售区域迁移调减 */
State_8(8,false),
/** 已取消 9-行政区域迁移调增 */
State_9(9,false),
/** 已取消 10-行政区域迁移调减 */
State_10(10,false),
/** 11-政策申请 */
State_11(11,false),
/** 12-政策申请调增(政策申请,预算调增) */
State_12(12,true),
/** 13-政策因费用申请调增(政策申请,预算转移) */
State_13(13,true),
/** 14-政策申请释放(被拒绝后,政策释放) */
State_14(14,true),
/** 15-费用申请释放(被拒绝后,预算增加) */
State_15(15,true),
/** 16-政策释放(释放操作,预算增加) */
State_16(16,true);
/**
* 编码
*/
private Integer code;
/**
* 是否取反添加预算
*/
private boolean addBudget;
private final static List<Integer> finalBudgetOptFlag = Arrays.asList(0, 2, 3);
public final static List<Integer> finalCostOptFlag = Arrays.asList(1,4,5,6);
public final static List<Integer> finalPolicyOptFlag = Arrays.asList(11,12,13,14,15);
/**
* 预算规划状态023新增调增调减
*/
public static List<Integer> getFinalBudgetOptFlag(){
return finalBudgetOptFlag;
}
}

2
src/main/java/com/qs/serve/common/model/enums/HttpCode.java

@ -21,7 +21,7 @@ public enum HttpCode {
LOGIN_ERR(401,"登录信息已过期或失效"),
LOGIN_ERR_2(500,"该账号已被停用,请联系系统管理员"),
LOGIN_ERR_1(500,"账号或登录密码不正确"),
LOGIN_ERR_4001(4001,"校区信息错误"),
LOGIN_ERR_4001(4001,"商户信息错误"),
LOGIN_ERR_4002(4002,"应用信息错误"),

40
src/main/java/com/qs/serve/common/model/enums/MonthValues.java

@ -0,0 +1,40 @@
package com.qs.serve.common.model.enums;
/**
* @author YenHex
* @since 2023/9/13
*/
public class MonthValues {
public static final int[] Q1 = {1,2,3};
public static final int[] Q2 = {4,5,6};
public static final int[] Q3 = {7,8,9};
public static final int[] Q4 = {10,11,12};
public static int[] getQArr(Integer val){
for (int i = 0; i < Q1.length; i++) {
if(val==Q1[i]){
return Q1;
}
}
for (int i = 0; i < Q2.length; i++) {
if(val==Q2[i]){
return Q2;
}
}
for (int i = 0; i < Q3.length; i++) {
if(val==Q3[i]){
return Q3;
}
}
for (int i = 0; i < Q4.length; i++) {
if(val==Q4[i]){
return Q4;
}
}
return null;
}
}

14
src/main/java/com/qs/serve/common/model/enums/SystemModule.java

@ -12,8 +12,20 @@ import lombok.Getter;
public enum SystemModule {
QUESTION("qms","问卷"),
BAZ("baz","拜访"),
Policy("tzc","政策"),
Payment("pay","支付"),
Budget("budget","预算"),
Verification("verification","核算"),
BIZ("biz","业务"),
BASE("bms","基础档案"),
GOODS("goods","商品"),
SYSTEM("sys","系统"),
UMS("ums","手机用户");
UMS("ums","手机用户"),
DATA("data","数据"),
Excel("excel","excel数据"),
Tag("tag","标签"),
SALE("sale","销售");
String code;

36
src/main/java/com/qs/serve/common/model/oa/OaFormMainProcess.java

@ -0,0 +1,36 @@
package com.qs.serve.common.model.oa;
import lombok.Data;
import java.util.List;
/**
* @author YenHex
* @since 2024/1/12
*/
@Data
public class OaFormMainProcess {
private String targetId;
/**
* 上次文件
*/
private List<OaUploadFile> uploadFiles;
/**
* data
*/
private Object data;
/**
* 员工号
*/
private String senderLoginName;
/**
* 模板编码
*/
private String templateCode;
}

27
src/main/java/com/qs/serve/common/model/oa/OaUploadFile.java

@ -0,0 +1,27 @@
package com.qs.serve.common.model.oa;
import lombok.Data;
/**
* @author YenHex
* @since 2024/1/12
*/
@Data
public class OaUploadFile {
/**
* 表单控件名称
*/
private String field;
/**
* 附件文件名
*/
private String name;
/**
* 附件url
*/
private String url;
}

62
src/main/java/com/qs/serve/common/util/AuthContextUtils.java

@ -4,6 +4,10 @@ import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.framework.security.model.LoginUserType;
import com.qs.serve.common.model.consts.GySysConst;
import com.qs.serve.common.model.enums.HttpCode;
import com.qs.serve.modules.bms.entity.BmsSupplier;
import com.qs.serve.modules.bms.service.BmsSupplierService;
import com.qs.serve.modules.wx.entity.WxUser;
import com.qs.serve.modules.wx.service.WxUserService;
import lombok.experimental.UtilityClass;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
@ -21,6 +25,7 @@ import java.util.Objects;
public class AuthContextUtils {
private final static ThreadLocal<String> THREAD_TENANT = new ThreadLocal<>();
private final static ThreadLocal<Long> THREAD_SUPPLIER = new ThreadLocal<>();
public static String getAppId(){
return getAppId(true);
@ -42,29 +47,13 @@ public class AuthContextUtils {
return getLoginUser(true);
}
/**
* 获取微信用户ID
* @return
*/
public static String getWxUserId(){
LoginUser loginUser = getLoginUser();
if(loginUser.getTypeFlag().equals(LoginUserType.APP_USER)){
return loginUser.getUserId();
}
return null;
}
/**
* 系统用户ID
* @return
*/
public static String getSysUserId(){
LoginUser loginUser = getLoginUser();
if(loginUser.getTypeFlag().equals(LoginUserType.SYS_SUP_USER)
||loginUser.getTypeFlag().equals(LoginUserType.SYS_USER)){
return loginUser.getUserId();
}
return null;
return loginUser.getUserId();
}
/**
@ -80,6 +69,45 @@ public class AuthContextUtils {
public static String getTenant(){return THREAD_TENANT.get();}
public static void setSupplierId(String value){
if(value!=null){
try {
THREAD_SUPPLIER.set(Long.parseLong(value));
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
}
public static BmsSupplier getCurrentSupplier(){
String userId = AuthContextUtils.getSysUserId();
Long supplierId = AuthContextUtils.getSupplierId();
BmsSupplierService supplierService = SpringUtils.getBean(BmsSupplierService.class);
BmsSupplier supplier = supplierService.getById(supplierId);
// if(supplier==null){
// Assert.throwEx(4106,"供应商无效或未授权");
// }
// boolean isOther = false;
//
// if(CollectionUtil.isNotEmpty(supplier.getOtherUserIds())){
// for (String otherUserId : supplier.getOtherUserIds()) {
// if(userId.equals(otherUserId)){
// isOther = true;
// break;
// }
// }
// }
// if(isOther && !supplier.getUserId().equals(userId)){
// Assert.throwEx(4106,"供应商无效或未授权");
// }
// if(supplier.getStopFlag().equals(1)){
// Assert.throwEx(4106,"供应商已停用");
// }
return supplier;
}
public static Long getSupplierId(){return THREAD_SUPPLIER.get();}
public static void removeTenant(){THREAD_TENANT.remove();}
public static LoginUser getLoginUser(boolean throwEx){

79
src/main/java/com/qs/serve/common/util/BusinessDifferenceUtil.java

@ -0,0 +1,79 @@
package com.qs.serve.common.util;
import com.qs.serve.common.framework.mybatis.join.annotations.BindEntity;
import com.qs.serve.common.model.annotation.BusinessDifference;
import com.qs.serve.common.model.dto.DiffFieldVal;
import com.qs.serve.modules.bms.entity.BmsSupplierContacts;
import com.qs.serve.modules.sys.entity.SysBusinessLog;
import lombok.SneakyThrows;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* @author YenHex
* @since 2023/4/25
*/
public class BusinessDifferenceUtil {
@SneakyThrows
public static <T> List<DiffFieldVal> getDifferenceList(T orgVal, T newVal){
List<DiffFieldVal> diffFieldValList = new ArrayList<>();
if(orgVal==null||newVal==null){
return diffFieldValList;
}
Class<?> clazz = null;
try {
clazz = Class.forName(orgVal.getClass().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(clazz==null){return diffFieldValList;}
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
for (Annotation annotation : field.getAnnotations()) {
if(annotation instanceof BusinessDifference){
BusinessDifference busDiff = (BusinessDifference) annotation;
field.setAccessible(true);
Object orgValue = field.get(orgVal);
Object newValue = field.get(newVal);
if(newValue==null){
continue;
}
if(orgValue==null){
orgValue = "";
}
if(!orgValue.equals(newValue)){
DiffFieldVal fieldVal = new DiffFieldVal();
fieldVal.setField(field.getName());
fieldVal.setNewValue(newValue.toString());
fieldVal.setOrgValue(orgValue.toString());
fieldVal.setComment(busDiff.value());
diffFieldValList.add(fieldVal);
}
}
}
}
return diffFieldValList;
}
public static void main(String[] args) {
BmsSupplierContacts supplierContacts = new BmsSupplierContacts();
supplierContacts.setContactsName("名称1");
supplierContacts.setContactsPost("setContactsPost");
BmsSupplierContacts supplierContacts2 = new BmsSupplierContacts();
supplierContacts2.setContactsName("名称2");
supplierContacts2.setContactsNumber("123456");
supplierContacts2.setContactsPost("setContactsPost");
List<DiffFieldVal> diffFieldValList =BusinessDifferenceUtil.getDifferenceList(supplierContacts,supplierContacts2);
for (DiffFieldVal fieldVal : diffFieldValList) {
System.out.println(JsonUtil.objectToJson(fieldVal));
}
}
}

146
src/main/java/com/qs/serve/common/util/CodeGenUtil.java

@ -0,0 +1,146 @@
package com.qs.serve.common.util;
import cn.hutool.core.util.IdUtil;
import com.qs.serve.common.config.DevEnvironmentConfig;
import com.qs.serve.common.framework.redis.RedisService;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.beans.BeansException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* 生成编号
* @author YenHex
* @since 2023/6/25
*/
public class CodeGenUtil {
@Getter
@AllArgsConstructor
public enum SourceKey{
CostApply("cost_apply"),
SalePlan("SalePlan"),
Activity("activity"),
OmsOrder("OmsOrder"),
Verification("verification"),
Policy("policy"),
Budget("Budget"),
BudgetChange("BudgetChange"),
BudgetBatch("BudgetBatch"),
AgreeCheck("AgreeCheck"),
PolicyItem("policy_item");
private String code;
}
@Getter
@AllArgsConstructor
public enum SourceDataKey{
TagInfo("T","TagInfo"),
SaleRegion("S","SaleRegion"),
BizRegion("B","BizRegion"),
ActivityPayCondition("K","ActivityPayCondition");
private String prefix;
private String code;
}
private static final int split_num = 1000;
final static String[] digits2 = {
"A" , "B" , "C" , "D" , "E" ,
"F" , "G" , "H" ,"J" , "K" ,
"L" , "M" , "N" , "P" ,
"Q" , "R" , "T" , "U" , "V" , "W" ,
"X" , "Y"
};
public static Long getIdx(String key){
RedisService redisService = SpringUtils.getBean(RedisService.class);
Long value = redisService.getLong(key);
if(value==null){
redisService.set(key,1);
value = 1L;
}else {
value++;
}
redisService.set(key,value);
return value;
}
public synchronized static String generate(SourceKey sourceKey){
try {
LocalDate localDateTime = LocalDate.now();
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");
String localTime = df.format(localDateTime);
localTime = localTime.substring(2);
String key = "code_index:"+sourceKey.getCode()+":"+localTime;
return localTime + getCommonValue(key);
} catch (BeansException e) {
e.printStackTrace();
}
return IdUtil.getSnowflakeNextIdStr();
}
public static String getCommonValue(String key){
Long value = getIdx(key);
String digitsNum = "";
String appendStr = value+"";
if(value>split_num){
appendStr = (value%100)+"";
Long d = value/split_num;
digitsNum = digits2[d.intValue()];
}
StringBuilder appendZeros = new StringBuilder();
for (int i = (appendStr+digitsNum).length(); i < 3; i++) {
appendZeros.append("0");
}
//用于区分测试环境数据
String subflex = DevEnvironmentConfig.isDev()?"T":"";
return digitsNum + appendZeros + appendStr+subflex;
}
public synchronized static String getDataCode(SourceDataKey dataKey){
String key = "code_data_index:"+dataKey.getCode();
String commonVal = getCommonValue(key);
return dataKey.getPrefix() + commonVal;
}
/**
* 32个字符用来表示32进制
*/
final static char[] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'A' , 'B' ,
'C' , 'D' , 'E' , 'F' , 'G' , 'H' ,
'J' , 'K' , 'L' , 'M' , 'N' , 'P' ,
'Q' , 'R' , 'T' , 'U' , 'V' , 'W' ,
'X' , 'Y'
};
/**
* 10=>32
* @param val
* @return
*/
static String digits32(long val) {
// 32=2^5=二进制100000
int shift = 5;
// numberOfLeadingZeros 获取long值从高位连续为0的个数,比如val=0,则返回64
// 此处mag=long值二进制减去高位0之后的长度
int mag = Long.SIZE - Long.numberOfLeadingZeros(val);
int len = Math.max(((mag + (shift - 1)) / shift), 1);
char[] buf = new char[len];
do {
// &31相当于%32
buf[--len] = digits[((int) val) & 31];
val >>>= shift;
} while (val != 0 && len > 0);
return new String(buf);
}
}

67
src/main/java/com/qs/serve/common/util/DateSplitUtil.java

@ -0,0 +1,67 @@
package com.qs.serve.common.util;
import com.qs.serve.common.model.dto.DateSplitDTO;
import lombok.experimental.UtilityClass;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* 分割时间DTO工具类
* @author YenHex
* @since 2023/6/5
*/
@UtilityClass
public class DateSplitUtil {
public static List<DateSplitDTO> getSplitDto(LocalDate sDate, LocalDate eDate){
int diffYear = eDate.getYear() - sDate.getYear();
int diffMonthOfYear = eDate.getMonthValue() - sDate.getMonthValue();
int diffMonth = diffYear * 12 + diffMonthOfYear;
//最后一个月的年月数
int lastYearMonth = eDate.getYear()*100 + eDate.getMonthValue();
int firstYearMonth = sDate.getYear()*100 + sDate.getMonthValue();
if(diffMonth<1){
//同一个月
int days = eDate.getDayOfMonth() - sDate.getDayOfMonth() + 1;
DateSplitDTO splitDTO = new DateSplitDTO(days,sDate,eDate,lastYearMonth,1);
return Arrays.asList(splitDTO);
}else {
List<DateSplitDTO> dateSplitDTOS = new ArrayList<>();
for (int i = 0; i < diffMonth+2; i++) {
int sort = i+1;
LocalDate newStartDate = sDate.plusMonths(i);
int currYearMonth = newStartDate.getYear()*100 + newStartDate.getMonthValue();
//第一个月
if(firstYearMonth==currYearMonth){
int days = sDate.lengthOfMonth() - sDate.getDayOfMonth() + 1;
//当月最后一天
LocalDate endLocalDate = LocalDate.of(sDate.getYear(),sDate.getMonth(),sDate.lengthOfMonth());
DateSplitDTO splitDTO = new DateSplitDTO(days,sDate,endLocalDate,currYearMonth,sort);
dateSplitDTOS.add(splitDTO);
}else if(currYearMonth==lastYearMonth){
int days = eDate.getDayOfMonth();
//当月第一天
LocalDate startDate = newStartDate.withDayOfMonth(1);
DateSplitDTO splitDTO = new DateSplitDTO(days,startDate,eDate,currYearMonth,sort);
dateSplitDTOS.add(splitDTO);
break;
}else {
int days = newStartDate.lengthOfMonth();
//当月第一天
LocalDate startDate = newStartDate.withDayOfMonth(1);
//当月最后一天
LocalDate endLocalDate = LocalDate.of(newStartDate.getYear(),newStartDate.getMonth(),newStartDate.lengthOfMonth());
DateSplitDTO splitDTO = new DateSplitDTO(days,startDate,endLocalDate,currYearMonth,sort);
dateSplitDTOS.add(splitDTO);
}
}
return dateSplitDTOS;
}
}
}

29
src/main/java/com/qs/serve/common/util/DateUtils.java

@ -5,9 +5,7 @@ import lombok.experimental.UtilityClass;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
@ -19,11 +17,36 @@ import java.util.Date;
@UtilityClass
public class DateUtils {
public static Date localDateToDate(LocalDate date){
//LocalDate date = LocalDate.of(2006,07,26);
ZoneId zone = ZoneId.systemDefault();
Instant instant = date.atStartOfDay().atZone(zone).toInstant();
java.util.Date da = Date.from(instant);
return da;
}
public static String getString(DateFormatString format){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format.getValue());
return LocalDateTime.now().format(formatter);
}
public static LocalDate toLocalDate(Date date){
// Instant instant = date.toInstant();
// ZoneId zoneId = ZoneId.systemDefault();
// return instant.atZone(zoneId).toLocalDate();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String str = dateFormat.format(date);
String[] a = str.split("-");
return LocalDate.of(Integer.parseInt(a[0]),Integer.parseInt(a[1]),Integer.parseInt(a[2]));
}
public static Date toDate(LocalDate localDate){
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
return Date.from(zdt.toInstant());
}
/**
* 获取设置后得时间
* @param time

147
src/main/java/com/qs/serve/common/util/HttpUtil.java

@ -0,0 +1,147 @@
package com.qs.serve.common.util;
import com.alibaba.fastjson.JSONObject;
import com.qs.serve.common.model.dto.R;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.HashMap;
/**
* @author YenHex
* @since 2022/11/23
*/
@Slf4j
@UtilityClass
public class HttpUtil {
private final static String CONTENT_TYPE = "application/json";
private final static String CHARSET = "UTF-8";
private final static String EN_CONING = "UTF-8";
public static String doPost(String url, String jsonStr, HashMap<String,String> headers) {
CloseableHttpClient client = HttpClientBuilder.create().build();
CloseableHttpResponse response = null;
String errorMsg = null;
try {
//设post请求
HttpPost post = new HttpPost(url);
//创建请求实体传参
if(jsonStr!=null){
StringEntity postingString = new StringEntity(jsonStr,CHARSET);
postingString.setContentEncoding(EN_CONING);
//设置post请求参数
post.setEntity(postingString);
}
post.addHeader(HTTP.CONTENT_TYPE,CONTENT_TYPE);
if (headers != null) {
for (String key : headers.keySet()) {
post.addHeader(key,headers.get(key));
}
}
//执行post请求
response = client.execute(post);
//访问成功状态码为200
if (response.getStatusLine().getStatusCode() == 200) {
return EntityUtils.toString(response.getEntity());
}
} catch (IOException e) {
errorMsg = e.getMessage();
e.printStackTrace();
}finally {
try {
client.close();
if(response!=null){
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return errorMsg;
}
public static String doGet(String url, HashMap<String,String> headers) {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpGet httpget = new HttpGet(url);
httpget.addHeader(HTTP.CONTENT_TYPE,CONTENT_TYPE);
if (headers != null) {
for (String key : headers.keySet()) {
httpget.addHeader(key,headers.get(key));
}
}
CloseableHttpResponse response = httpclient.execute(httpget);
try {
if (response.getStatusLine().getStatusCode() == 200) {
return EntityUtils.toString(response.getEntity());
}
} finally {
response.close();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
public static String createUrl(HashMap<String,String> param){
StringBuilder sb = new StringBuilder();
for (String key : param.keySet()) {
sb.append("&"+key+"="+param.get(key));
}
return sb.toString();
}
public static R<String> doGetResult(String url,HashMap<String,String> headers){
String result = HttpUtil.doGet(url,headers);
log.debug("url:{},result:{}",url,result);
if(result==null){
Assert.throwEx("远程服务连接失败");
}
JSONObject jsonObject = JSONObject.parseObject(result);
Integer status = jsonObject.getInteger("status");
String msg = jsonObject.getString("msg");
String data = jsonObject.getString("data");
return new R(status,msg,data);
}
public static R<String> doPostResult(String url, String jsonStr, HashMap<String,String> headers){
String result = HttpUtil.doPost(url,jsonStr,headers);
log.debug("url:{},result:{}",url,result);
if(result==null){
log.warn("jsonStr:{}",jsonStr);
Assert.throwEx("远程服务连接失败");
}
JSONObject jsonObject = JSONObject.parseObject(result);
Integer status = jsonObject.getInteger("status");
String msg = jsonObject.getString("msg");
String data = jsonObject.getString("data");
return new R(status,msg,data);
}
}

12
src/main/java/com/qs/serve/common/util/IdUtil.java

@ -13,6 +13,7 @@ import java.util.Random;
public class IdUtil extends cn.hutool.core.util.IdUtil {
private static final long BASE_DIFF_MILLIS = 1648013774104L;
private static final long BASE_DIFF_MILLIS2 = 1578585779603640320L;
private static final Snowflake snowflake = getSnowflake(1,1);
@ -24,10 +25,12 @@ public class IdUtil extends cn.hutool.core.util.IdUtil {
return prefix + String.format("%03d", end2);
}
public static Long timeStampLong() {
return System.currentTimeMillis()-BASE_DIFF_MILLIS;
}
public static String dateTimeStampId() {
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
@ -37,6 +40,13 @@ public class IdUtil extends cn.hutool.core.util.IdUtil {
return localTime + String.format("%03d", end2);
}
public static String dateTimeId() {
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
String localTime = df.format(localDateTime);
return localTime;
}
public static String genCode(int len) {
int max = new Double(Math.pow(10, len)).intValue() - 1;
Random random = new Random();
@ -45,7 +55,7 @@ public class IdUtil extends cn.hutool.core.util.IdUtil {
}
public static long getSnowFlakeId(){
return snowflake.nextId();
return snowflake.nextId()-BASE_DIFF_MILLIS2;
}
}

107
src/main/java/com/qs/serve/common/util/JdbcUtil.java

@ -0,0 +1,107 @@
package com.qs.serve.common.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 原生JDBC工具类
* @Author JcYen
* @Date 2021/6/4
*/
@Slf4j
public class JdbcUtil {
private static final String[] FILTER_WORD = new String[]{"truncate","create","alter","eval","delete","sp_password"};
/**
* 执行SQL为安全拦截delete语句
* @param username
* @param password
* @param url
* @param driverName
* @param sql
* @return
*/
public static List<Map<String,Object>> query(String username, String password, String url, String driverName, String sql) {
//检查SQL,防止SQL执行DDL语句
doSqlFilter(sql);
List<Map<String,Object>> list = new ArrayList();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url, username, password);
stmt = conn.createStatement();
log.debug("JDBC工具类 Preparing SQL: {}",url);
rs = stmt.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while (rs.next()) {
Map<String,Object> rowData = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
} catch (ClassNotFoundException e) {
log.warn(e.getMessage());
} catch (SQLException throwables) {
log.error(throwables.getMessage());
}finally {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
rs = null;
stmt = null;
conn = null;
}
return list;
}
private static void doSqlFilter(String sql){
boolean unsafe = false;
String[] parts = sql.split(" ");
for (String part : parts) {
if(unsafe){ break; }
if(StringUtils.isEmpty(part)){
continue;
}
part = part.trim();
for (String filterWord : FILTER_WORD) {
if(part.equalsIgnoreCase(filterWord)){
unsafe = true;
break;
}
}
}
if(unsafe){
//AssertUtil.("非法SQL被拦截 ==> "+sql);
}
}
}

2
src/main/java/com/qs/serve/common/util/JsonUtil.java

@ -7,6 +7,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.experimental.UtilityClass;
import java.util.ArrayList;
@ -31,6 +32,7 @@ public class JsonUtil {
static {
MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
MAPPER.registerModule(new JavaTimeModule());
}
/**

18
src/main/java/com/qs/serve/common/util/JumpToUtil.java

@ -0,0 +1,18 @@
package com.qs.serve.common.util;
import lombok.experimental.UtilityClass;
/**
* @author YenHex
* @since 2023/6/8
*/
@UtilityClass
public class JumpToUtil {
public static String getJumpUrl(String host, String templateCode, String targetId) {
return host + "/#/jump?jumpType=apiApproval" +
"&targetCode="+templateCode
+"&targetId="+targetId;
}
}

22
src/main/java/com/qs/serve/common/util/PageUtil.java

@ -28,7 +28,7 @@ public class PageUtil {
private static final String ORDER_TYPE_ASC = "ASC";
private static final String ORDER_TYPE_DESC = "DESC";
private static final int MAX_PAGE_SIZE = 66;
private static final int MAX_PAGE_SIZE = 100;
public static <T> Page<T> getMbpPage(){
Integer pageNum = getPageNum();
@ -55,6 +55,12 @@ public class PageUtil {
public static Integer getPageNum(){
Integer pageNum=null;
String pageNumStr = ServletUtils.getParameter(PAGE_NUM);
if(!StringUtils.hasText(pageNumStr)){
Object pageNumObj = ServletUtils.getSession().getAttribute(PAGE_NUM);
if(pageNumObj!=null){
pageNumStr = pageNumObj.toString();
}
}
if(StringUtils.hasText(pageNumStr)){
pageNum = Integer.parseInt(pageNumStr);
}
@ -64,6 +70,12 @@ public class PageUtil {
public static Integer getPageSize(){
String pageSizeStr = ServletUtils.getParameter(PAGE_SIZE);
Integer pageSize = null;
if(!StringUtils.hasText(pageSizeStr)){
Object pageNumObj = ServletUtils.getSession().getAttribute(PAGE_SIZE);
if(pageNumObj!=null){
pageSizeStr = pageNumObj.toString();
}
}
if(StringUtils.hasText(pageSizeStr)){
pageSize = Integer.parseInt(pageSizeStr);
}
@ -86,6 +98,14 @@ public class PageUtil {
return null;
}
public static void setPageSize(String pageSize){
ServletUtils.getSession().setAttribute(PAGE_SIZE,pageSize);
}
public static void setPageNum(String pageNum){
ServletUtils.getSession().setAttribute(PAGE_NUM,pageNum);
}
public static String getOrderType(){
String orderType = ServletUtils.getParameter(ORDER_TYPE);
if(StringUtils.hasText(orderType)){

6
src/main/java/com/qs/serve/common/util/ServletUtils.java

@ -1,5 +1,6 @@
package com.qs.serve.common.util;
import com.qs.serve.common.model.consts.GySysConst;
import lombok.experimental.UtilityClass;
import org.springframework.http.MediaType;
import org.springframework.web.context.request.RequestAttributes;
@ -29,6 +30,11 @@ public class ServletUtils {
return getRequest().getParameter(name);
}
public static String getAuthToken(){
HttpServletRequest request = getRequest();
return request.getHeader(GySysConst.AUTHORIZATION_PROP);
}
/**
* 获取String参数
*/

91
src/main/java/com/qs/serve/common/util/StringUtils.java

@ -2,6 +2,17 @@ package com.qs.serve.common.util;
import lombok.experimental.UtilityClass;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author YenHex
* @since 2022/2/28
@ -9,6 +20,59 @@ import lombok.experimental.UtilityClass;
@UtilityClass
public class StringUtils extends org.springframework.util.StringUtils {
/** 订单号生成(NEW) **/
private static final AtomicInteger SEQ = new AtomicInteger(1000);
private static final AtomicInteger SEQ2 = new AtomicInteger(10001);
private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmssSS");
private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai");
public static String generateOrderNo(){
LocalDateTime dataTime = LocalDateTime.now(ZONE_ID);
if(SEQ.intValue()>9990){
SEQ.getAndSet(1000);
}
return dataTime.format(DF_FMT_PREFIX)+SEQ.getAndIncrement();
}
public static String genShortId() {
// 2 位 年份的后两位 22001 后五位走随机 每天清一次缓存 99999 10
StringBuilder idSb = new StringBuilder();
/// 年份后两位 和 一年中的第几天
LocalDate now = LocalDate.now();
String year = now.getYear() + "";
year = year.substring(2);
String day = now.getDayOfYear() + "";
/// 补0
if (day.length() < 3) {
StringBuilder sb = new StringBuilder();
for (int i = day.length(); i < 3; i++) {
sb.append("0");
}
day = sb.append(day).toString();
}
idSb.append(year).append(day);
/// 后五位补随机数
if(SEQ2.intValue()>99900){
SEQ2.getAndSet(10000);
}
idSb.append(SEQ2.getAndIncrement());
return idSb.toString();
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(genShortId());
//System.out.println(generateOrderNo());
}
}
public static String tailorLen(String str,int len){
if(StringUtils.hasText(str)&&str.length()>len){
return str.substring(0,len-2)+"...";
}
return str;
}
/** 非空 */
public static boolean isNotEmpty(String str){
return !isEmpty(str);
@ -22,6 +86,14 @@ public class StringUtils extends org.springframework.util.StringUtils {
return false;
}
public static String getUrlByList(List<?> list,String param){
StringBuilder sb = new StringBuilder();
for (Object val : list) {
sb.append("&"+param+"="+val);
}
return sb.toString();
}
/**
* 格式化
* @param exp {}的表达式
@ -47,4 +119,23 @@ public class StringUtils extends org.springframework.util.StringUtils {
return a.toString().contains(text);
}
public static List<String> splitIdString(String ids){
if(ids==null){
return null;
}
if(ids.contains(",")){
String[] idsA= ids.split(",");
return Arrays.asList(idsA);
}
return Arrays.asList(ids);
}
public static List<Long> splitIdLong(String ids){
List<String> strs = splitIdString(ids);
if(strs!=null){
return strs.stream().map(Long::parseLong).collect(Collectors.toList());
}
return null;
}
}

85
src/main/java/com/qs/serve/common/util/ValidateTools.java

@ -0,0 +1,85 @@
package com.qs.serve.common.util;
import com.qs.serve.common.framework.exception.BusinessException;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.HibernateValidator;
import org.springframework.util.CollectionUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.List;
import java.util.Set;
/**
* validate方法中校验工具类
* <p>
* 只要在实体中加上相应的validate的相关注解即可
* </p>
*
* @author Zed
*/
@UtilityClass
public class ValidateTools {
/**
* 初始化检查器
*/
private static final ValidatorFactory VALIDATOR_FACTORY = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory();
private static final Validator VALIDATOR = VALIDATOR_FACTORY.getValidator();
/**
* 校验返回异常信息
*
* @param t 实体
* @param <T> 实体泛型
*/
public static <T> String validStr(T t) {
// 构造返回信息
StringBuilder validMessage = new StringBuilder();
// 检查实体T
Set<ConstraintViolation<T>> set = VALIDATOR.validate(t);
// 循环set,获取检查结果
for (ConstraintViolation<T> vo : set) {
validMessage.append(vo.getMessage()).append(";");
}
return validMessage.toString();
}
/**
* 校验实体抛出异常
*
* @param t 实体
* @param <T> 实体泛型
*/
public static <T> void valid(T t) {
String validStr = validStr(t);
// 抛出业务异常
if (StringUtils.isNotBlank(validStr)) {
throw new BusinessException(validStr,500);
}
}
/**
* 校验集合抛出异常
*
* @param list 列表
* @param <T> 实体泛型
*/
public static <T> void valid(List<T> list) {
if (CollectionUtils.isEmpty(list)) {
throw new BusinessException("数据不存在!",500);
}
// 构造返回信息
StringBuilder validMessageTotal = new StringBuilder();
// 遍历
for (int i = 0; i < list.size(); i++) {
String validStr = validStr(list.get(i));
if (StringUtils.isNotBlank(validStr)) {
String msg = String.format("第%d条数据校验结果:[%s]\n", i + 1, validStr);
validMessageTotal.append(msg);
}
}
// 抛出业务异常
if (StringUtils.isNotBlank(validMessageTotal.toString())) {
throw new BusinessException(validMessageTotal.toString(),500);
}
}
}

10
src/main/java/com/qs/serve/common/util/WarpUtil.java

@ -40,11 +40,11 @@ public class WarpUtil extends AnnotationQueryStorage {
String orderType = ServletUtils.getParameter(ORDER_TYPE_NAME);
if(StringUtils.isNotEmpty(columnsString)){
String[] columns = columnsString.split(",");
if(orderType.equals(ORDER_DESC)){
queryWrapper.orderByDesc(columns);
}else {
queryWrapper.orderByAsc(columns);
}
// if(orderType.equals(ORDER_DESC)){
// queryWrapper.orderByDesc(columns);
// }else {
// queryWrapper.orderByAsc(columns);
// }
}
}
return queryWrapper;

1
src/main/java/com/qs/serve/common/util/model/DateFormatString.java

@ -12,6 +12,7 @@ import lombok.Getter;
public enum DateFormatString {
DATE_TIME("yyyy-MM-dd HH:mm:ss"),
DATE_TIME2("yyyy-MM-dd HH:mm:ss.000"),
DATE_TIME_NUM("yyyyMMddHHmmss"),
DATE_TIME_CN("yyyy年MM月dd日 HH时mm分ss秒"),

28
src/main/java/com/qs/serve/common/util/model/QsJsonLocalDateTimeDeserializer.java

@ -0,0 +1,28 @@
package com.qs.serve.common.util.model;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @author YenHex
* @since 2023/7/25
*/
public class QsJsonLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {
String val = jsonParser.getText();
if (val==null||val.isEmpty()){
return null;
}
return LocalDateTime.parse(val,df);
}
}

122
src/main/java/com/qs/serve/controller/AdminPortalController.java

@ -2,6 +2,7 @@ package com.qs.serve.controller;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.config.properties.ProjectProperties;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.model.annotation.LimitSubmit;
import com.qs.serve.common.model.annotation.SysLog;
@ -9,6 +10,12 @@ import com.qs.serve.common.model.consts.RedisCacheKeys;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.util.IdUtil;
import com.qs.serve.common.util.StringUtils;
import com.qs.serve.controller.dto.SyLoginParam;
import com.qs.serve.controller.util.SyKeyLoginUtil;
import com.qs.serve.modules.seeyon.entity.SyAffairStateResult;
import com.qs.serve.modules.seeyon.enums.SyAffairState;
import com.qs.serve.modules.seeyon.service.SeeYonRequestService;
import com.qs.serve.modules.sys.entity.SysTenant;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.entity.dto.SysLoginByPhoneParam;
@ -18,12 +25,26 @@ import com.qs.serve.modules.sys.mapper.SysNoticeUserMapper;
import com.qs.serve.modules.sys.service.SysTenantService;
import com.qs.serve.modules.sys.service.SysUserLoginService;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.tbs.common.TbsSeeYonConst;
import com.qs.serve.modules.tbs.entity.TbsActivity;
import com.qs.serve.modules.tbs.entity.TbsCostApply;
import com.qs.serve.modules.tbs.service.TbsActivityService;
import com.qs.serve.modules.tbs.service.TbsCostApplyService;
import com.qs.serve.modules.third.ThirdTokenUtil;
import com.qs.serve.modules.tzc.entity.TzcPolicy;
import com.qs.serve.modules.tzc.service.TzcPolicyService;
import com.qs.serve.modules.vtb.entity.VtbVerification;
import com.qs.serve.modules.vtb.service.VtbVerificationService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
@ -41,6 +62,13 @@ public class AdminPortalController {
private SysUserLoginService sysUserLoginService;
private RedisService redisService;
private SysUserService sysUserService;
private ProjectProperties projectProperties;
private SeeYonRequestService seeYonRequestService;
private TbsCostApplyService costApplyService;
private VtbVerificationService verificationService;
private TzcPolicyService policyService;
private TbsActivityService activityService;
/**
* 获取所有租户
@ -52,6 +80,93 @@ public class AdminPortalController {
return R.ok(list);
}
/**
* 致远远程跳转接口
* @param param
* @param response
* @throws IOException
*/
@GetMapping("/syKeyLogin")
public void getList(SyLoginParam param, HttpServletResponse response) throws IOException {
String templateCode = param.getTemplateCode();
String syId = param.getSyId();
// dev remove
if(!StringUtils.hasText(syId)){
response.sendRedirect(projectProperties.getWebUrl()+"/#/login?");
return;
}
String key = param.getKey();
SyAffairStateResult affairStateResult = seeYonRequestService.checkAffairState(key,syId,templateCode);
// dev add
//syId = affairStateResult.getMemberId();
if(affairStateResult.getState()==SyAffairState.error){
response.sendRedirect(projectProperties.getWebUrl()+"/#/login?");
return;
}
//通过类型和key获取审批id
String targetId = affairStateResult.getTargetId();
String affairId = affairStateResult.getAffairId();
String memberId = affairStateResult.getMemberId();
//通过syId生成token
String token = sysUserLoginService.loginBySyUserId(syId);
if(token==null){
response.sendRedirect(projectProperties.getWebUrl()+"/#/login?");
return;
}else {
String jumpUrl = "404";
SyAffairState affairState = affairStateResult.getState();
if(affairState!=SyAffairState.none&&affairState!=SyAffairState.error){
//判断是否当前人员
if(syId.equals(memberId)){
//待审列表
if (affairState==SyAffairState.next){
if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){
VtbVerification object = verificationService.getById(targetId);
TbsActivity activity = activityService.getById(object.getActivityId());
jumpUrl = SyKeyLoginUtil.getPreCheckUrl4Verification(activity.getCostApplyId(),activity.getId(),object.getId(),affairId);
}else{
jumpUrl = SyKeyLoginUtil.getPreCheckUrl(templateCode,targetId,affairId);
}
}else {
if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){
VtbVerification object = verificationService.getById(targetId);
TbsActivity activity = activityService.getById(object.getActivityId());
jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl4Verification(activity.getCostApplyId(),activity.getId(),object.getId());
}else{
jumpUrl = SyKeyLoginUtil.getCheckedDetailUrl(templateCode,targetId);
}
}
}else{
//判断是否创建人,创建人则跳转到详情
SysUser sysUser = sysUserService.getBySyId(syId);
String creator = null;
//非当前表单用户跳转到404页面
if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code())){
TbsCostApply object = costApplyService.getById(targetId);
creator = object.getCreateBy();
}else if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){
VtbVerification object = verificationService.getById(targetId);
creator = object.getCreateBy();
}else if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){
TzcPolicy object = policyService.getById(targetId);
creator = object.getCreateBy();
}
if(creator!=null&&creator.equals(sysUser.getId())){
jumpUrl = SyKeyLoginUtil.getMyDetailUrl(templateCode,targetId);
}
}
}
String fontUrl = projectProperties.getWebUrl() + "/#/jump?code=001&token="+token+"&jumpTo="+jumpUrl;
log.warn("fontUrl:{}",fontUrl);
response.sendRedirect(fontUrl);
}
}
/**
* 登录接口
@ -64,6 +179,7 @@ public class AdminPortalController {
return R.ok(sysUserLoginService.login(param));
}
/**
* 手机登陆
* @return
@ -95,8 +211,8 @@ public class AdminPortalController {
public R<?> phoneCode(@PathVariable("phone") String phone){
LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysUser::getAccount,phone);
int count = sysUserService.count(wrapper);
if(count<1){
Long count = sysUserService.count(wrapper);
if(count<1L){
return R.error("无效手机号,请重新输入");
}
String key = RedisCacheKeys.PHONE_KEY+phone;
@ -105,7 +221,7 @@ public class AdminPortalController {
code = IdUtil.genCode(6);
}
redisService.set(key,code,1, TimeUnit.MINUTES);
//TODO send msg
// send msg
return R.ok();
}

12
src/main/java/com/qs/serve/controller/CommonController.java

@ -5,6 +5,7 @@ import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.util.*;
import com.qs.serve.modules.oss.service.OssService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@ -32,6 +33,17 @@ public class CommonController {
private UploadProperties uploadProperties;
private OssService ossService;
/**
* 获取签名
* @param request
* @return
*/
@GetMapping("/getSign")
public R getSign(HttpServletRequest request) {
return R.ok(ossService.getPolicySign());
}
/**

103
src/main/java/com/qs/serve/controller/WxSvcLoginApi.java

@ -3,6 +3,7 @@ package com.qs.serve.controller;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.framework.security.model.LoginUserType;
import com.qs.serve.common.framework.security.service.SysUserDetailsServiceImpl;
import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.consts.RedisCacheKeys;
import com.qs.serve.common.model.dto.R;
@ -10,11 +11,17 @@ import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.HttpCode;
import com.qs.serve.common.model.enums.InterType;
import com.qs.serve.common.util.*;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.mapper.SysTenantMapper;
import com.qs.serve.modules.sys.service.SysUserService;
import com.qs.serve.modules.wx.entity.WxUser;
import com.qs.serve.modules.wx.entity.dto.WxLoginUser;
import com.qs.serve.modules.wx.service.WxUserService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@ -42,6 +49,55 @@ public class WxSvcLoginApi {
private final RedisService redisService;
private final SysUserDetailsServiceImpl userDetailsService;
private final SysTenantMapper sysTenantMapper;
private SysUserService sysUserService;
/**
* 小程序登陆(暂测试)
* @param wxLoginUser
* @param request
* @return
*/
@SysLog(title = "小程序登录",biz = BizType.LOGIN,inter = InterType.API)
@PostMapping("/ma")
public R<?> loginMicroApp(@RequestBody @Valid WxLoginUser wxLoginUser, HttpServletRequest request){
Map<String,Object> objectMap = new HashMap<>();
WxUser wxUser = null;
try {
// wxUser = wxUserService.login(wxLoginUser);
} catch (Exception e) {
log.warn(e.getMessage());
}
if(wxUser==null){
Assert.throwEx(HttpCode.WX_ERR);
}
String token = IdUtil.fastSimpleUUID();
LoginUser loginUser = new LoginUser(wxUser.getId(),wxUser.getEmpName(),"",
ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
objectMap.put("token",token);
//微信登录ID
String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token);
redisService.set(wxUserKey,wxUser.getId());
//后台管理员信息
Map<String,Object> tokenMap = new HashMap<>(10);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,wxUser.getSysUserId());
String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(),loginUser.getTypeFlag(),client);
redisService.set(redisKey,pctoken);
tokenMap.put("token", pctoken);
tokenMap.put("userId", wxUser.getSysUserId());
tokenMap.put("IP", loginUser.getLoginIp());
tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant()));
tokenMap.put("loginType",client);
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
return R.ok(objectMap);
}
/**
* 公众号登录
@ -63,11 +119,32 @@ public class WxSvcLoginApi {
Assert.throwEx(HttpCode.WX_ERR);
}
String token = IdUtil.fastSimpleUUID();
String key = RedisCacheKeys.LOGIN_KEY_WX + token;
LoginUser loginUser = new LoginUser(wxUser.getId(),wxUser.getEmpName(),"",
ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
redisService.set(key, JsonUtil.objectToJson(loginUser.loginUserDTO()),2, TimeUnit.DAYS);
objectMap.put("token",token);
//微信登录ID
String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token);
redisService.set(wxUserKey,wxUser.getId());
//后台管理员信息
Map<String,Object> tokenMap = new HashMap<>(10);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,wxUser.getSysUserId());
String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(),loginUser.getTypeFlag(),client);
redisService.set(redisKey,pctoken);
tokenMap.put("token", pctoken);
tokenMap.put("userId", wxUser.getSysUserId());
tokenMap.put("IP", loginUser.getLoginIp());
tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant()));
tokenMap.put("loginType",client);
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
//设置
// SysUser sysUser = sysUserService.getById(wxUser.getSysUserId());
// UserDetails userDetails = userDetailsService.buildLoginUser(sysUser);
// UsernamePasswordAuthenticationToken authentication =
// new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
// SecurityContextHolder.getContext().setAuthentication(authentication);
return R.ok(objectMap);
}
@ -77,12 +154,28 @@ public class WxSvcLoginApi {
@PostMapping("/mptest")
public R<?> login(HttpServletRequest request){
Map<String,Object> objectMap = new HashMap<>();
String token = TokenUtil.desEncrypt(IdUtil.timeStampId());
String key = RedisCacheKeys.LOGIN_KEY_WX + token;
String token = IdUtil.fastSimpleUUID();
//微信登录ID
String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token);
redisService.set(wxUserKey,"1");
LoginUser loginUser = new LoginUser("1","微信测试用户","",
ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
redisService.set(key, JsonUtil.objectToJson(loginUser.loginUserDTO()),2, TimeUnit.DAYS);
objectMap.put("token",token);
String sysUserId = "1";
Map<String,Object> tokenMap = new HashMap<>(10);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,sysUserId);
String pctoken = JwtUtils.generateToken(sysUserId,loginUser.getTypeFlag(),client);
redisService.set(redisKey,pctoken);
tokenMap.put("token", pctoken);
tokenMap.put("userId", sysUserId);
tokenMap.put("IP", loginUser.getLoginIp());
tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant()));
tokenMap.put("loginType",client);
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
return R.ok(objectMap);
}

27
src/main/java/com/qs/serve/controller/dto/SyLoginParam.java

@ -0,0 +1,27 @@
package com.qs.serve.controller.dto;
import lombok.Data;
/**
* @author YenHex
* @since 2023/6/8
*/
@Data
public class SyLoginParam {
/**
* 模板编码
*/
private String templateCode;
/**
* 表单data的exsp5字段值
*/
private String key;
/**
* 致远员工id
*/
private String syId;
}

115
src/main/java/com/qs/serve/controller/util/SyKeyLoginUtil.java

@ -0,0 +1,115 @@
package com.qs.serve.controller.util;
import com.qs.serve.modules.tbs.common.TbsSeeYonConst;
import lombok.experimental.UtilityClass;
/**
* @author YenHex
* @since 2023/6/12
*/
@UtilityClass
public class SyKeyLoginUtil {
/**
* 获取待审批详情
* @param templateCode
* @param targetId
* @param affairId
* @return
*/
public static String getPreCheckUrl(String templateCode,String targetId,String affairId){
if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code())
||templateCode.equals(TbsSeeYonConst.CostApplyContractConf.Code())){
return "my-expense-application-approval-pending-detail?expenseApplicationId="+targetId+"&approvalId="+affairId;
}
if(templateCode.equals(TbsSeeYonConst.CheckCostAgreeConf.Code())){
return "my-expense-application-agreement-terms-approval-pending-detail?agreementTermsId="+targetId+"&approvalId="+affairId;
}
// if(templateCode.equals(TbsSeeYonConst.CostCheckConf.Code())){
// return "my-expense-application-activity-write-off-approval-pending-detail?" +
// "expenseApplicationId=382658" + //费用id
// "&writeOffId=1936474" + //核销id
// "&activityId=2277848" + //活动id
// "&approvalId="+affairId;
// }
if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){
return "my-policy-application-approval-pending-detail?policyApplicationId=" + targetId +
"&approvalId="+affairId;
}
return "404";
}
/**
* 获取核销待审批详情
* @param costApplyId
* @param activityId
* @param verificationId
* @param affairId
* @return
*/
public static String getPreCheckUrl4Verification(Long costApplyId,
Long activityId,
Long verificationId,
String affairId){
return "my-expense-application-activity-write-off-approval-pending-detail?" +
"expenseApplicationId=" + costApplyId+ //费用id
"&writeOffId=" + verificationId +//核销id
"&activityId=" + activityId +//活动id
"&approvalId="+affairId;
}
/**
* 获取已审批详情
* @param templateCode
* @param targetId
* @return
*/
public static String getCheckedDetailUrl(String templateCode,String targetId){
if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code())){
return "my-expense-application-approval-approved-detail?expenseApplicationId="+targetId
+"&approvalId=0";
}
if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){
return "my-policy-application-approval-approved-detail?policyApplicationId=" + targetId +
"&approvalId=0";
}
return "404";
}
/**
* 获取核销待审批详情
* @param costApplyId
* @param activityId
* @param verificationId
* @return
*/
public static String getCheckedDetailUrl4Verification(Long costApplyId,
Long activityId,
Long verificationId){
return "my-expense-application-activity-write-off-approval-approved-detail?" +
"expenseApplicationId=" + costApplyId+ //费用id
"&writeOffId=" + verificationId +//核销id
"&activityId=" + activityId +//活动id
"&approvalId=0";
}
/**
* 获取个人申请详情
* @param templateCode
* @param targetId
* @return
*/
public static String getMyDetailUrl(String templateCode,String targetId){
if(templateCode.equals(TbsSeeYonConst.CostApplyConf.Code())){
return "my-expense-application-detail?id="+targetId;
}
if(templateCode.equals(TbsSeeYonConst.PolicyConf.Code())){
return "my-policy-application-detail?id="+targetId;
}
return "404";
}
}

4
src/main/java/com/qs/serve/modules/base/TencentYunSmsService.java

@ -52,8 +52,8 @@ public class TencentYunSmsService {
req.setTemplateId(templateId);
//todo 调整短信模板
String[] templateParamSet = {code,code,code};
// 调整短信模板
String[] templateParamSet = {code};
req.setTemplateParamSet(templateParamSet);
String[] phoneNumberSet = {"+86"+phone};

48
src/main/java/com/qs/serve/modules/base/TianYiYunSmsService.java

@ -0,0 +1,48 @@
package com.qs.serve.modules.base;
import cn.hutool.crypto.digest.DigestUtil;
import com.qs.serve.common.util.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
* @author YenHex
* @since 2024/1/26
*/
@Slf4j
@Service
public class TianYiYunSmsService {
private final String url = "http://sms.189ek.com/yktsms/send?";
@Value("${tianyi.sms.appid}")
private String appId;
@Value("${tianyi.sms.appKey}")
private String appKey;
public void send(String phone,String code){
//需要发送的手机号(多个号码以英文逗号 “,”分隔) 一次性最多 100 个号码
String mobiles = phone;
String content = "【嘉士利】验证码"+code;
String sign = DigestUtil.md5Hex(appId+mobiles+content+appKey);
try {
String msg = URLEncoder.encode(content,"utf-8");
String params = "appid="+ appId +
"&mobile="+ mobiles +
"&msg=" + msg +
"&sign=" + sign +
"&extPort=";
String result = HttpUtil.doPost(url+params,"{}",null);
log.debug("sms result = > {}",result);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}

122
src/main/java/com/qs/serve/modules/base/controller/JslApiController.java

@ -0,0 +1,122 @@
package com.qs.serve.modules.base.controller;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.consts.GySysConst;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.ValidateTools;
import com.qs.serve.modules.bms.entity.bo.BmsSupplierBatchBo;
import com.qs.serve.modules.bms.mapper.BmsSupplierMapper;
import com.qs.serve.modules.bms.service.BmsSupplierService;
import com.qs.serve.modules.goods.entity.bo.GoodsSpuBatchTasteBo;
import com.qs.serve.modules.goods.service.GoodsSpuService;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.entity.bo.SysUserBatchBo;
import com.qs.serve.modules.sys.entity.bo.SysUserBo;
import com.qs.serve.modules.sys.service.SysRoleService;
import com.qs.serve.modules.sys.service.SysUserSalesService;
import com.qs.serve.modules.sys.service.SysUserService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* 嘉士利对接
* @author YenHex
* @since 2022/10/28
*/
@Slf4j
@AllArgsConstructor
//@RestController
//@RequestMapping("/jsl")
public class JslApiController {
private SysUserService sysUserService;
private SysRoleService sysRoleService;
private BmsSupplierService bmsSupplierService;
private SysUserSalesService sysUserSalesService;
private GoodsSpuService goodsSpuService;
/**
* 客户档案
* @param param
* @return
*/
//@PostMapping("/supplier/editBatch")
//@SysLog(module = SystemModule.BASE, title = "供应商", biz = BizType.INSERT)
@PreAuthorize("hasRole('bms:supplier:insert')")
public R<?> editBatch(@RequestBody @Valid BmsSupplierBatchBo param){
bmsSupplierService.editBatch(param);
return R.ok();
}
/**
* 业务员档案
* @param batchBo
* @return
*/
//@SysLog(title = "人员",desc = "用户新增",biz = BizType.INSERT)
//@PostMapping("/user/editBatch")
//@PreAuthorize("hasRole('sys:user:insert')")
@Transactional(rollbackFor = Exception.class)
public R<?> saveBatch(@RequestBody @Valid SysUserBatchBo batchBo){
for (SysUserBo userBo : batchBo.getUserList()) {
SysUser dbData = sysUserService.getById(userBo.getId());
SysUser param = CopierUtil.copy(userBo,dbData==null?new SysUser():dbData);
//设置普通管理员
param.setSuperFlag(0);
param.setTenantId(AuthContextUtils.getTenant());
param.setAccount(param.getMobile());
param.setPassword(SecureUtil.md5(GySysConst.DEFAULT_PASSWORD));
if(param.getMobile()!=null){
param.setAccount(param.getMobile());
}
//检查手机号是否已用
LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
wrapper.ne(SysUser::getId,userBo.getId());
wrapper.eq(SysUser::getMobile,param.getMobile());
Long count = sysUserService.count(wrapper);
if(count>0L){
return R.error("手机号已被注册");
}
if(dbData == null){
sysUserService.save(param);
}else {
sysUserService.updateById(param);
}
// if(param.getId()!=null&& com.qs.serve.common.util.CollectionUtil.isNotEmpty(userBo.getRoleIds())){
// sysRoleService.saveUserRole4Edit(userBo.getRoleIds(),param.getId());
// }
}
return R.ok();
}
/**
* (批量)编辑口味品类SPU,建议每次小于50条
* @param param
* @return
*/
//@PostMapping("/saveBatchTasteSpu")
//@SysLog(module = SystemModule.GOODS, title = "spu", biz = BizType.INSERT)
//@PreAuthorize("hasRole('goods:spu:insert')")
public R<?> saveBatchTasteSpu(@RequestBody GoodsSpuBatchTasteBo param){
ValidateTools.valid(param.getTasteProducts());
return R.ok(goodsSpuService.saveBatchTasteSpu(param));
}
}

12
src/main/java/com/qs/serve/modules/baz/common/BazTargetTypeConsts.java

@ -0,0 +1,12 @@
package com.qs.serve.modules.baz.common;
/**
* @author YenHex
* @since 2023/4/7
*/
public interface BazTargetTypeConsts {
String POINT = "point";
String CUSTOMER = "customer";
}

148
src/main/java/com/qs/serve/modules/baz/controller/BazVisitController.java

@ -0,0 +1,148 @@
package com.qs.serve.modules.baz.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.dto.PageVo;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.PageUtil;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.StringUtils;
import com.qs.serve.modules.baz.entity.BazVisitFlow;
import com.qs.serve.modules.baz.service.BazVisitFlowService;
import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm;
import com.qs.serve.modules.bms.service.BmsSupplierVisitFormService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import com.qs.serve.modules.baz.entity.BazVisit;
import com.qs.serve.modules.baz.service.BazVisitService;
import javax.validation.Valid;
import java.util.List;
/**
* 拜访模块 拜访
* @author YenHex
* @since 2023-04-07
*/
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("baz/visit")
public class BazVisitController {
private BazVisitService bazVisitService;
private BazVisitFlowService bazVisitFlowService;
private BmsSupplierVisitFormService bmsSupplierVisitFormService;
/**
* 列表
* @param param
* @return
*/
@GetMapping("/list")
public R<List<BazVisit>> getList(BazVisit param){
LambdaQueryWrapper<BazVisit> lqw = new LambdaQueryWrapper<>(param);
List<BazVisit> list = bazVisitService.list(lqw);
return R.ok(list);
}
/**
* 获取第一个流程
* @param visitId
* @return
*/
@GetMapping("/getFirstFlow/{visitId}")
@SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.QUERY)
public R<BazVisitFlow> getFirstFlow(@PathVariable("visitId") String visitId){
LambdaQueryWrapper<BazVisitFlow> lqw = new LambdaQueryWrapper<>();
lqw.eq(BazVisitFlow::getFlowSort,1);
lqw.eq(BazVisitFlow::getVisitId,visitId);
BazVisitFlow bazVisitFlow = bazVisitFlowService.getOne(lqw,false);
if(bazVisitFlow.getFormId()!=null&&!bazVisitFlow.getFormId().equals(0L)){
BmsSupplierVisitForm visitForm = bmsSupplierVisitFormService.getById(bazVisitFlow.getFormId());
bazVisitFlow.setFormInfo(visitForm);
}else {
bazVisitFlow.setFormId(null);
}
return R.ok(bazVisitFlow);
}
/**
* 翻页
* @param param
* @return
*/
//@GetMapping("/page")
@PreAuthorize("hasRole('baz:visit:query')")
public R<PageVo<BazVisit>> getPage(BazVisit param){
LambdaQueryWrapper<BazVisit> lqw = new LambdaQueryWrapper<>(param);
PageUtil.startPage();
List<BazVisit> list = bazVisitService.list(lqw);
return R.byPageHelperList(list);
}
/**
* ID查询
* @param id
* @return
*/
//@GetMapping("/getById/{id}")
//@SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.QUERY)
@PreAuthorize("hasRole('baz:visit:query')")
public R<BazVisit> getById(@PathVariable("id") String id){
BazVisit bazVisit = bazVisitService.getById(id);
return R.ok(bazVisit);
}
/**
* 更新
* @param param
* @return
*/
//@PostMapping("/updateById")
@SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.UPDATE)
@PreAuthorize("hasRole('baz:visit:update')")
public R<?> updateById(@RequestBody @Valid BazVisit param){
boolean result = bazVisitService.updateById(param);
return R.isTrue(result);
}
/**
* 新增
* @param param
* @return
*/
//@PostMapping("/save")
@SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.INSERT)
@PreAuthorize("hasRole('baz:visit:insert')")
public R<?> save(@RequestBody @Valid BazVisit param){
boolean result = bazVisitService.save(param);
return R.isTrue(result);
}
/**
* 删除
* @param ids
* @return
*/
//@DeleteMapping("/deleteById/{ids}")
@SysLog(module = SystemModule.BAZ, title = "拜访", biz = BizType.DELETE)
@PreAuthorize("hasRole('baz:visit:delete')")
public R<?> deleteById(@PathVariable("ids") String ids){
List<Long> idsLong = StringUtils.splitIdLong(ids);
boolean result = bazVisitService.removeByIds(idsLong);
return R.isTrue(result);
}
}

153
src/main/java/com/qs/serve/modules/baz/controller/BazVisitFlowController.java

@ -0,0 +1,153 @@
package com.qs.serve.modules.baz.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.dto.PageVo;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.PageUtil;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.StringUtils;
import com.qs.serve.modules.baz.entity.bo.BazVisitFlowSortBo;
import com.qs.serve.modules.bms.entity.BmsSupplierVisitForm;
import com.qs.serve.modules.bms.service.BmsSupplierVisitFormService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import com.qs.serve.modules.baz.entity.so.BazVisitFlowSo;
import com.qs.serve.modules.baz.entity.bo.BazVisitFlowBo;
import com.qs.serve.modules.baz.entity.BazVisitFlow;
import com.qs.serve.modules.baz.service.BazVisitFlowService;
import javax.validation.Valid;
import java.util.Comparator;
import java.util.List;
/**
* 拜访模块 拜访流程
* @author YenHex
* @since 2023-04-07
*/
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("baz/visitFlow")
public class BazVisitFlowController {
private BazVisitFlowService bazVisitFlowService;
private BmsSupplierVisitFormService visitFormService;
/**
* 列表
* @param param
* @return
*/
@GetMapping("/list")
public R<List<BazVisitFlow>> getList(BazVisitFlowSo param){
BazVisitFlow entity = CopierUtil.copy(param,new BazVisitFlow());
LambdaQueryWrapper<BazVisitFlow> lqw = new LambdaQueryWrapper<>(entity);
lqw.orderByAsc(BazVisitFlow::getFlowSort);
List<BazVisitFlow> list = bazVisitFlowService.list(lqw);
return R.ok(list);
}
/**
* 翻页
* @param param
* @return
*/
@GetMapping("/page")
public R<PageVo<BazVisitFlow>> getPage(BazVisitFlowSo param){
BazVisitFlow entity = CopierUtil.copy(param,new BazVisitFlow());
LambdaQueryWrapper<BazVisitFlow> lqw = new LambdaQueryWrapper<>(entity);
PageUtil.startPage();
lqw.orderByAsc(BazVisitFlow::getFlowSort);
List<BazVisitFlow> list = bazVisitFlowService.list(lqw);
return R.byPageHelperList(list);
}
/**
* ID查询
* @param id
* @return
*/
@GetMapping("/getById/{id}")
@SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.QUERY)
public R<BazVisitFlow> getById(@PathVariable("id") String id){
BazVisitFlow bazVisitFlow = bazVisitFlowService.getById(id);
if(bazVisitFlow.getFormId()!=null&&!bazVisitFlow.getFormId().equals(0L)){
BmsSupplierVisitForm visitForm = visitFormService.getById(bazVisitFlow.getFormId());
bazVisitFlow.setFormInfo(visitForm);
}else {
bazVisitFlow.setFormId(null);
}
return R.ok(bazVisitFlow);
}
/**
* 更新
* @param param
* @return
*/
@PostMapping("/updateById")
@SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.UPDATE)
public R<?> updateById(@RequestBody @Valid BazVisitFlowBo param){
if(param.getId()==null){
return R.error2();
}
bazVisitFlowService.modify(param);
return R.ok();
}
/**
* 新增
* @param param
* @return
*/
@PostMapping("/save")
@SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.INSERT)
public R<?> save(@RequestBody @Valid BazVisitFlowBo param){
param.setId(null);
BazVisitFlow visitFlow = bazVisitFlowService.modify(param);
return R.ok(visitFlow);
}
/**
* 更新排序
* @param param
* @return
*/
@PostMapping("/sort")
@SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.INSERT)
public R<?> sort(@RequestBody @Valid BazVisitFlowSortBo param){
List<BazVisitFlowSortBo.Item> items = param.getSortValues();
items.sort(Comparator.comparingInt(BazVisitFlowSortBo.Item::getSortValue));
for (int i = 0; i < items.size(); i++) {
BazVisitFlowSortBo.Item item = items.get(i);
BazVisitFlow visitFlow = new BazVisitFlow();
visitFlow.setId(item.getId());
visitFlow.setFlowSort(i+1);
bazVisitFlowService.updateById(visitFlow);
}
return R.ok();
}
/**
* 删除
* @param ids
* @return
*/
@DeleteMapping("/deleteById/{ids}")
@SysLog(module = SystemModule.BAZ, title = "拜访流程", biz = BizType.DELETE)
public R<?> deleteById(@PathVariable("ids") String ids){
List<Long> idsLong = StringUtils.splitIdLong(ids);
boolean result = bazVisitFlowService.removeByIds(idsLong);
return R.isTrue(result);
}
}

146
src/main/java/com/qs/serve/modules/baz/controller/BazVisitInstanceController.java

@ -0,0 +1,146 @@
package com.qs.serve.modules.baz.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.dto.PageVo;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.PageUtil;
import com.qs.serve.common.util.CopierUtil;
import com.qs.serve.common.util.StringUtils;
import com.qs.serve.modules.baz.entity.BazVisitInstanceFlow;
import com.qs.serve.modules.baz.service.BazVisitInstanceFlowService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import com.qs.serve.modules.baz.entity.so.BazVisitInstanceSo;
import com.qs.serve.modules.baz.entity.BazVisitInstance;
import com.qs.serve.modules.baz.service.BazVisitInstanceService;
import javax.validation.Valid;
import java.util.List;
/**
* 拜访模块 拜访实例
* @author YenHex
* @since 2023-04-07
*/
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("baz/visitInstance")
public class BazVisitInstanceController {
private BazVisitInstanceService bazVisitInstanceService;
private BazVisitInstanceFlowService bazVisitInstanceFlowService;
/**
* 翻页
* @param param
* @return
*/
@GetMapping("/page")
public R<PageVo<BazVisitInstance>> getPage(BazVisitInstanceSo param){
BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance());
if(param.getQueryStartDate()!=null){
query.setQueryEndDate(param.getQueryStartDate().atStartOfDay());
}
if(param.getQueryEndDate()!=null){
query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59));
}
PageUtil.startPage();
List<BazVisitInstance> list = bazVisitInstanceService.selectBazVisitInstanceList(query);
return R.byPageHelperList(list);
}
/**
* 列表
* @param param
* @return
*/
@GetMapping("/list")
public R<List<BazVisitInstance>> getList(BazVisitInstanceSo param){
BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance());
if(param.getQueryStartDate()!=null){
query.setQueryEndDate(param.getQueryStartDate().atStartOfDay());
}
if(param.getQueryEndDate()!=null){
query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59));
}
List<BazVisitInstance> list = bazVisitInstanceService.selectBazVisitInstanceList(query);
return R.ok(list);
}
/**
* ID查询
* @param id
* @return
*/
@GetMapping("/getById/{id}")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.QUERY)
public R<BazVisitInstance> getById(@PathVariable("id") String id){
BazVisitInstance bazVisitInstance = bazVisitInstanceService.getById(id);
LambdaQueryWrapper<BazVisitInstanceFlow> lqw = new LambdaQueryWrapper<>();
lqw.eq(BazVisitInstanceFlow::getVisitInstanceId,id);
List<BazVisitInstanceFlow> flowList = bazVisitInstanceFlowService.list(lqw);
bazVisitInstance.setFlowList(flowList);
return R.ok(bazVisitInstance);
}
/**
* ID查询流程项
* @param id
* @return
*/
@GetMapping("/getByFlowId/{id}")
public R<BazVisitInstanceFlow> getByFlowId(@PathVariable("id") String id){
BazVisitInstanceFlow instanceFlow = bazVisitInstanceFlowService.getById(id);
BazVisitInstance visitInstance = bazVisitInstanceService.getById(instanceFlow.getVisitInstanceId());
instanceFlow.setInstanceMainInfo(visitInstance);
return R.ok(instanceFlow);
}
/**
* 更新
* @param param
* @return
*/
//@PostMapping("/updateById")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.UPDATE)
public R<?> updateById(@RequestBody @Valid BazVisitInstance param){
boolean result = bazVisitInstanceService.updateById(param);
return R.isTrue(result);
}
/**
* 新增
* @param param
* @return
*/
//@PostMapping("/save")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT)
public R<?> save(@RequestBody @Valid BazVisitInstance param){
boolean result = bazVisitInstanceService.save(param);
return R.isTrue(result);
}
/**
* 删除
* @param ids
* @return
*/
@DeleteMapping("/deleteById/{ids}")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.DELETE)
public R<?> deleteById(@PathVariable("ids") String ids){
List<Long> idsLong = StringUtils.splitIdLong(ids);
boolean result = bazVisitInstanceService.removeByIds(idsLong);
return R.isTrue(result);
}
}

231
src/main/java/com/qs/serve/modules/baz/controller/my/BazMyVisitInstanceController.java

@ -0,0 +1,231 @@
package com.qs.serve.modules.baz.controller.my;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qs.serve.common.model.annotation.SysLog;
import com.qs.serve.common.model.dto.PageVo;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.BizType;
import com.qs.serve.common.model.enums.SystemModule;
import com.qs.serve.common.util.*;
import com.qs.serve.modules.baz.entity.BazVisit;
import com.qs.serve.modules.baz.entity.BazVisitInstance;
import com.qs.serve.modules.baz.entity.bo.BazCreateVisitInstanceBo;
import com.qs.serve.modules.baz.entity.bo.BazVisitInstanceFlowBo;
import com.qs.serve.modules.baz.entity.so.BazVisitInstanceSo;
import com.qs.serve.modules.baz.service.BazVisitInstanceService;
import com.qs.serve.modules.baz.service.BazVisitService;
import com.qs.serve.modules.sys.service.SysPostService;
import com.qs.serve.modules.sys.service.SysPostUserService;
import com.qs.serve.modules.sys.service.SysUserSalesService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 拜访模块 拜访实例(我的)
* @author YenHex
* @since 2023-04-07
*/
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("baz/myVisitInstance")
public class BazMyVisitInstanceController {
private BazVisitInstanceService bazVisitInstanceService;
private BazVisitService visitService;
private SysPostUserService postUserService;
/**
* 翻页
* @param param
* @return
*/
@GetMapping("/page")
public R<PageVo<BazVisitInstance>> getPage(BazVisitInstanceSo param){
BazVisitInstance entity = CopierUtil.copy(param,new BazVisitInstance());
LambdaQueryWrapper<BazVisitInstance> lqw = new LambdaQueryWrapper<>(entity);
if(param.getQueryStartDate()!=null){
lqw.ge(BazVisitInstance::getCreateTime,param.getQueryStartDate());
}
if(param.getQueryEndDate()!=null){
lqw.le(BazVisitInstance::getCreateTime,param.getQueryEndDate().atTime(23,59,59));
}
PageUtil.startPage();
lqw.eq(BazVisitInstance::getVisitorId, AuthContextUtils.getSysUserId());
lqw.orderByDesc(BazVisitInstance::getCreateTime);
List<BazVisitInstance> list = bazVisitInstanceService.list(lqw);
return R.byPageHelperList(list);
}
/**
* 翻页(我的部下)
* @param param
* @return
*/
@GetMapping("/page4Under")
public R<PageVo<BazVisitInstance>> page4Under(BazVisitInstanceSo param){
BazVisitInstance entity = CopierUtil.copy(param,new BazVisitInstance());
LambdaQueryWrapper<BazVisitInstance> lqw = new LambdaQueryWrapper<>(entity);
if(param.getQueryStartDate()!=null){
lqw.ge(BazVisitInstance::getCreateTime,param.getQueryStartDate());
}
if(param.getQueryEndDate()!=null){
lqw.le(BazVisitInstance::getCreateTime,param.getQueryEndDate().atTime(23,59,59));
}
List<String> userIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId());
if(userIds.size()<1){
return R.byEmptyList();
}
String userId = AuthContextUtils.getSysUserId();
PageUtil.startPage();
lqw.in(BazVisitInstance::getVisitorId, userIds);
lqw.ne(BazVisitInstance::getVisitorId,userId);
lqw.orderByDesc(BazVisitInstance::getCreateTime);
List<BazVisitInstance> list = bazVisitInstanceService.list(lqw);
return R.byPageHelperList(list);
}
/**
* 列表
* @param param
* @return
*/
@GetMapping("/list")
public R<List<BazVisitInstance>> getList(BazVisitInstanceSo param){
BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance());
if(param.getQueryStartDate()!=null){
query.setQueryEndDate(param.getQueryStartDate().atStartOfDay());
}
if(param.getQueryEndDate()!=null){
query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59));
}
param.setVisitorId(AuthContextUtils.getSysUserId());
List<BazVisitInstance> list = bazVisitInstanceService.selectBazVisitInstanceList(query);
return R.ok(list);
}
/**
* 列表(我的部下)
* @param param
* @return
*/
@GetMapping("/list4Under")
public R<List<BazVisitInstance>> list4Under(BazVisitInstanceSo param){
BazVisitInstance query = CopierUtil.copy(param,new BazVisitInstance());
if(param.getQueryStartDate()!=null){
query.setQueryEndDate(param.getQueryStartDate().atStartOfDay());
}
if(param.getQueryEndDate()!=null){
query.setQueryEndDate(param.getQueryEndDate().atTime(23,59,59));
}
List<String> userIds = postUserService.listByChildIds(AuthContextUtils.getSysUserId());
if(userIds.size()<1){
return R.ok();
}
String userId = AuthContextUtils.getSysUserId();
PageUtil.startPage();
query.setQueryUserIds(userIds);
query.setIgnoreUserId(userId);
List<BazVisitInstance> list = bazVisitInstanceService.selectBazVisitInstanceList(query);
return R.ok(list);
}
/**
* 获取用户未完成拜访数量
* @param visitId 拜访id
* @return
*/
@GetMapping("/getCounter")
public R<?> getPage(Long visitId){
LambdaQueryWrapper<BazVisitInstance> lqw = new LambdaQueryWrapper<>();
lqw.eq(BazVisitInstance::getVisitId,visitId);
lqw.eq(BazVisitInstance::getVisitorId,AuthContextUtils.getSysUserId());
lqw.eq(BazVisitInstance::getVisitState,0);
long unFinished = bazVisitInstanceService.count(lqw);
Map<String,Object> map = new HashMap<>();
map.put("unFinished",unFinished);
return R.ok(map,"ok");
}
/**
* 统计创建数量用于判断当天是否提交
* @param visitId
* @param targetId
* @return
*/
@GetMapping("/countCreate")
public R<?> getPage(String visitId,String targetId){
BazVisit bazVisit = visitService.getById(visitId);
LambdaQueryWrapper<BazVisitInstance> limitVisitLqw = new LambdaQueryWrapper<>();
limitVisitLqw.eq(BazVisitInstance::getVisitorId,AuthContextUtils.getSysUserId());
limitVisitLqw.eq(BazVisitInstance::getTargetType,bazVisit.getTargetType());
limitVisitLqw.eq(BazVisitInstance::getTargetId,targetId);
limitVisitLqw.ge(BazVisitInstance::getCreateTime, LocalDate.now());
long count = bazVisitInstanceService.count(limitVisitLqw);
return R.ok(count);
}
/**
* 创建流程
* @param param
* @return
*/
@PostMapping("/create")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT)
public R<BazVisitInstance> save(@RequestBody @Valid BazCreateVisitInstanceBo param){
BazVisitInstance result = bazVisitInstanceService.create(param);
return R.ok(result);
}
/**
* 提交流程
* @param param
* @return
*/
@PostMapping("/submitFlow")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT)
public R<BazVisitInstance> save(@RequestBody @Valid BazVisitInstanceFlowBo param){
bazVisitInstanceService.submit(param);
return R.ok();
}
/**
* 完成流程
* @param id
* @return
*/
@PostMapping("/finished/{instanceId}")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.INSERT)
public R<BazVisitInstance> finished(@PathVariable("instanceId")Long id){
bazVisitInstanceService.finished(id);
return R.ok();
}
/**
* 删除
* @param ids
* @return
*/
@DeleteMapping("/deleteById/{ids}")
@SysLog(module = SystemModule.BAZ, title = "拜访实例", biz = BizType.DELETE)
public R<?> deleteById(@PathVariable("ids") String ids){
List<Long> idsLong = StringUtils.splitIdLong(ids);
LambdaQueryWrapper<BazVisitInstance> lqw = new LambdaQueryWrapper<>();
lqw.in(BazVisitInstance::getId,idsLong);
lqw.eq(BazVisitInstance::getVisitorId, AuthContextUtils.getSysUserId());
boolean result = bazVisitInstanceService.remove(lqw);
return R.isTrue(result);
}
}

95
src/main/java/com/qs/serve/modules/baz/entity/BazVisit.java

@ -0,0 +1,95 @@
package com.qs.serve.modules.baz.entity;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访 实体类
* @author YenHex
* @since 2023-04-07
*/
@Data
@TableName("baz_visit")
public class BazVisit implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@TableId(type = IdType.AUTO)
private Long id;
/** 拜访名称 */
@NotBlank(message = "拜访名称不能为空")
@Length(max = 255,message = "拜访名称长度不能超过255字")
private String visitName;
/** 目标类型 */
@NotBlank(message = "目标类型不能为空")
@Length(max = 255,message = "目标类型长度不能超过255字")
private String targetType;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/** 最后更新时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/** 所属租户 */
@JsonIgnore
@JsonProperty
private String tenantId;
/** 逻辑删除标记(0:显示;1:隐藏) */
@JsonIgnore
@JsonProperty
private String delFlag;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 更新人 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
public static BazVisit toNewObject(BazVisit source){
BazVisit visit = new BazVisit();
visit.setId(source.getId());
visit.setVisitName(source.getVisitName());
visit.setTargetType(source.getTargetType());
visit.setRemark(source.getRemark());
visit.setCreateTime(source.getCreateTime());
visit.setUpdateTime(source.getUpdateTime());
visit.setTenantId(source.getTenantId());
visit.setDelFlag(source.getDelFlag());
visit.setCreateBy(source.getCreateBy());
visit.setUpdateBy(source.getUpdateBy());
return visit;
}
}

125
src/main/java/com/qs/serve/modules/baz/entity/BazVisitFlow.java

@ -0,0 +1,125 @@
package com.qs.serve.modules.baz.entity;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.qs.serve.modules.baz.entity.bo.BazVisitFlowBo;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访流程 实体类
* @author YenHex
* @since 2023-04-07
*/
@Data
@TableName("baz_visit_flow")
public class BazVisitFlow implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@TableId(type = IdType.AUTO)
private Long id;
/** 拜访id */
@NotNull(message = "拜访id不能为空")
private Long visitId;
/** 拜访名称 */
private String visitName;
/** 目标类型 */
@NotBlank(message = "目标类型不能为空")
@Length(max = 255,message = "目标类型长度不能超过255字")
private String targetType;
/** 流程名称 */
@NotBlank(message = "流程名称不能为空")
@Length(max = 255,message = "流程名称长度不能超过255字")
private String flowTitle;
/** 排序 */
private Integer flowSort;
/** 业务类型:0-普通;1->签到;2-签退;3->小结 */
private Integer flowBizType;
/** 是否可忽略 */
@NotNull(message = "是否可忽略不能为空")
private Integer ignoreFlag;
/** 是否定位 */
@NotNull(message = "是否定位不能为空")
private Integer positionState;
/** 是否拍照 */
@NotNull(message = "是否拍照不能为空")
private Integer photoState;
/** 表单id (0表示空值)*/
@NotNull(message = "表单id不能为空")
private Long formId;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/** 最后更新时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/** 所属租户 */
@JsonIgnore
@JsonProperty
private String tenantId;
/** 逻辑删除标记(0:显示;1:隐藏) */
@JsonIgnore
@JsonProperty
private String delFlag;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 更新人 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
@TableField(exist = false)
private Object formInfo;
public static BazVisitFlow toNewObject(BazVisitFlowBo source){
BazVisitFlow visitFlow = new BazVisitFlow();
visitFlow.setId(source.getId());
visitFlow.setVisitId(source.getVisitId());
visitFlow.setFlowTitle(source.getFlowTitle());
visitFlow.setIgnoreFlag(source.getIgnoreFlag());
visitFlow.setPositionState(source.getPositionState());
visitFlow.setPhotoState(source.getPhotoState());
visitFlow.setFormId(source.getFormId());
visitFlow.setRemark(source.getRemark());
return visitFlow;
}
}

119
src/main/java/com/qs/serve/modules/baz/entity/BazVisitInfo.java

@ -0,0 +1,119 @@
package com.qs.serve.modules.baz.entity;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 供应商拜访信息 实体类
* @author YenHex
* @since 2023-04-10
*/
@Data
@TableName("baz_visit_info")
public class BazVisitInfo implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@TableId(type = IdType.AUTO)
private Long id;
/** 访问id */
@NotNull(message = "访问id不能为空")
private Long visitId;
/** 目标类型 */
@NotBlank(message = "目标类型不能为空")
@Length(max = 255,message = "目标类型长度不能超过255字")
private String targetType;
/** 目标id */
@NotNull(message = "目标id不能为空")
private String targetId;
private String userId;
/** 拜访次数 */
@NotNull(message = "拜访次数不能为空")
private Integer visitCount;
/** 上次拜访时间 */
@Length(max = 0,message = "上次拜访时间长度不能超过0字")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime lastVisitTime;
/** 计划下一次拜访时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate nextVisitDate;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/** 最后更新时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/** 所属租户 */
@JsonIgnore
@JsonProperty
private String tenantId;
/** 逻辑删除标记(0:显示;1:隐藏) */
@JsonIgnore
@JsonProperty
private String delFlag;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 更新人 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
public static BazVisitInfo toNewObject(BazVisitInfo source){
BazVisitInfo visitInfo = new BazVisitInfo();
visitInfo.setId(source.getId());
visitInfo.setVisitId(source.getVisitId());
visitInfo.setTargetType(source.getTargetType());
visitInfo.setTargetId(source.getTargetId());
visitInfo.setVisitCount(source.getVisitCount());
visitInfo.setLastVisitTime(source.getLastVisitTime());
visitInfo.setNextVisitDate(source.getNextVisitDate());
visitInfo.setRemark(source.getRemark());
visitInfo.setCreateTime(source.getCreateTime());
visitInfo.setUpdateTime(source.getUpdateTime());
visitInfo.setTenantId(source.getTenantId());
visitInfo.setDelFlag(source.getDelFlag());
visitInfo.setCreateBy(source.getCreateBy());
visitInfo.setUpdateBy(source.getUpdateBy());
return visitInfo;
}
}

193
src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstance.java

@ -0,0 +1,193 @@
package com.qs.serve.modules.baz.entity;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.qs.serve.common.model.dto.TargetDTO;
import com.qs.serve.modules.sys.entity.SysUser;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* 拜访实例 实体类
* @author YenHex
* @since 2023-04-07
*/
@Data
@TableName("baz_visit_instance")
public class BazVisitInstance implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@TableId(type = IdType.AUTO)
private Long id;
/** 标题 */
@NotBlank(message = "标题不能为空")
@Length(max = 255,message = "标题长度不能超过255字")
private String title;
/** 拜访类型id */
@NotNull(message = "拜访类型id不能为空")
private Long visitId;
/** 目标类型 */
@NotBlank(message = "目标类型不能为空")
@Length(max = 255,message = "目标类型长度不能超过255字")
private String targetType;
/** 拜访状态:0-进行中;1-完成 */
@NotNull(message = "拜访状态:0-进行中;1-完成不能为空")
private Integer visitState;
/** 拜访人id */
@NotBlank(message = "拜访人id不能为空")
@Length(max = 255,message = "拜访人id长度不能超过255字")
private String visitorId;
/** 拜访人编码 */
@NotBlank(message = "拜访人编码不能为空")
@Length(max = 255,message = "拜访人编码长度不能超过255字")
@TableField(condition = SqlCondition.LIKE)
private String visitorCode;
/** 拜访人 */
@NotBlank(message = "拜访人不能为空")
@Length(max = 255,message = "拜访人长度不能超过255字")
@TableField(condition = SqlCondition.LIKE)
private String visitorName;
/** 目标id */
@NotBlank(message = "目标id不能为空")
@Length(max = 255,message = "目标id长度不能超过255字")
private String targetId;
/** 目标i编码 */
@Length(max = 255,message = "目标i编码长度不能超过255字")
@TableField(condition = SqlCondition.LIKE)
private String targetCode;
/** 目标名称 */
@NotBlank(message = "目标名称不能为空")
@Length(max = 255,message = "目标名称长度不能超过255字")
@TableField(condition = SqlCondition.LIKE)
private String targetName;
private String targetLocalX;
private String targetLocalY;
private String targetAddress;
private String targetMapAddress;
/** 遗失定位标识 */
private Integer missLocalFlag;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime finishedTime;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
@TableField(condition = SqlCondition.LIKE)
private String positionStatusContent;
private String positionStatus;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/** 最后更新时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/** 所属租户 */
@JsonIgnore
@JsonProperty
private String tenantId;
/** 逻辑删除标记(0:显示;1:隐藏) */
@JsonIgnore
@JsonProperty
private String delFlag;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 更新人 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
@TableField(exist = false)
private List<?> flowList;
/** 拜访小结 */
@TableField(exist = false)
private String summary;
/** 签到时间 */
@TableField(exist = false)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime signTime;
/** 签退时间 */
@TableField(exist = false)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime outTime;
/** 查询开始时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
@TableField(exist = false)
private LocalDateTime queryStartDate;
/** 查询结束时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
@TableField(exist = false)
private LocalDateTime queryEndDate;
/** 查询用户ID */
@TableField(exist = false)
private List<String> queryUserIds;
/** 忽略的用户ID */
@TableField(exist = false)
private String ignoreUserId;
public static BazVisitInstance toNewObject(BazVisit source, TargetDTO targetDTO, SysUser sysUser){
BazVisitInstance visitInstance = new BazVisitInstance();
//visitInstance.setTitle(source.getTitle());
visitInstance.setVisitId(source.getId());
visitInstance.setTargetType(source.getTargetType());
visitInstance.setVisitState(0);
visitInstance.setVisitorId(sysUser.getId());
visitInstance.setVisitorCode(sysUser.getCode());
visitInstance.setVisitorName(sysUser.getName());
visitInstance.setTargetId(targetDTO.getTargetId());
visitInstance.setTargetCode(targetDTO.getTargetCode());
visitInstance.setTargetName(targetDTO.getTargetName());
visitInstance.setRemark(source.getRemark());
return visitInstance;
}
}

212
src/main/java/com/qs/serve/modules/baz/entity/BazVisitInstanceFlow.java

@ -0,0 +1,212 @@
package com.qs.serve.modules.baz.entity;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.qs.serve.common.framework.mybatis.handler.meta.SplitStringTypeHandler;
import com.qs.serve.common.model.dto.TargetDTO;
import com.qs.serve.modules.baz.entity.bo.BazVisitInstanceFlowBo;
import com.qs.serve.modules.sys.entity.SysUser;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访实例流程 实体类
* @author YenHex
* @since 2023-04-07
*/
@Data
@TableName(value = "baz_visit_instance_flow",autoResultMap = true)
public class BazVisitInstanceFlow implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@TableId(type = IdType.AUTO)
private Long id;
/** 拜访实例id */
@NotNull(message = "拜访实例id不能为空")
private Long visitInstanceId;
/** 拜访id */
@NotNull(message = "拜访id不能为空")
private Long visitId;
/** 目标类型 */
@NotBlank(message = "目标类型不能为空")
@Length(max = 255,message = "目标类型长度不能超过255字")
private String targetType;
/** 目标id */
@NotBlank(message = "目标id不能为空")
@Length(max = 255,message = "目标id长度不能超过255字")
private String targetId;
/** 目标编码 */
@Length(max = 255,message = "目标编码长度不能超过255字")
private String targetCode;
/** 目标名称 */
@NotBlank(message = "目标名称不能为空")
@Length(max = 255,message = "目标名称长度不能超过255字")
private String targetName;
/** 目标地址id */
@Length(max = 255,message = "目标地址id长度不能超过255字")
private String targetAddressId;
/** 流程名称 */
@NotBlank(message = "流程名称不能为空")
@Length(max = 255,message = "流程名称长度不能超过255字")
private String flowTitle;
/** 业务类型:0-普通;1->签到;2-签退;3->小结 */
private Integer flowBizType;
/** 排序 */
private Integer flowSort;
/** 状态:0-进行中;1-完成;2-跳过 */
private Integer flowState;
/** 是否可忽略当前流程 */
private Integer ignoreFlag;
/** 是否定位 */
private Integer positionState;
/** 是否拍照 */
private Integer photoState;
/** 表单id(0表示空值) */
private Long formId;
/** 表单Json */
@Length(max = 0,message = "表单Json长度不能超过0字")
private String formJson;
/** 输入值 */
@Length(max = 255,message = "输入值长度不能超过255字")
private String valInputValue;
/** 地图地址 */
private String mapAddress;
/** 纬度 */
@Length(max = 255,message = "纬度长度不能超过255字")
private String valLocalX;
/** 经度 */
@Length(max = 255,message = "经度长度不能超过255字")
private String valLocalY;
/** 拍照图片地址 */
@TableField(typeHandler = SplitStringTypeHandler.class,jdbcType= JdbcType.VARCHAR)
private String[] valPhotoUrls;
/** 表单填写json */
@Length(max = 0,message = "表单填写json长度不能超过0字")
private String valFormValue;
/** 拜访人id */
@NotBlank(message = "拜访人id不能为空")
@Length(max = 255,message = "拜访人id长度不能超过255字")
private String visitorId;
/** 拜访人编码 */
@NotBlank(message = "拜访人编码不能为空")
@Length(max = 255,message = "拜访人编码长度不能超过255字")
private String visitorCode;
/** 拜访人 */
@NotBlank(message = "拜访人不能为空")
@Length(max = 255,message = "拜访人长度不能超过255字")
private String visitorName;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime submitTime;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
/** 创建时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/** 最后更新时间 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/** 所属租户 */
@JsonIgnore
@JsonProperty
private String tenantId;
/** 逻辑删除标记(0:显示;1:隐藏) */
@JsonIgnore
@JsonProperty
private String delFlag;
/** 创建人 */
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 更新人 */
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
@TableField(exist = false)
private Object instanceMainInfo;
public static BazVisitInstanceFlow toNewObject(BazVisitFlow source, TargetDTO targetDTO, SysUser user){
BazVisitInstanceFlow visitInstanceFlow = new BazVisitInstanceFlow();
visitInstanceFlow.setVisitId(source.getVisitId());
visitInstanceFlow.setTargetType(source.getTargetType());
visitInstanceFlow.setTargetId(targetDTO.getTargetId());
visitInstanceFlow.setTargetCode(targetDTO.getTargetCode());
visitInstanceFlow.setTargetName(targetDTO.getTargetName());
visitInstanceFlow.setFlowTitle(source.getFlowTitle());
visitInstanceFlow.setFlowBizType(source.getFlowBizType());
visitInstanceFlow.setFlowSort(source.getFlowSort());
visitInstanceFlow.setIgnoreFlag(source.getIgnoreFlag());
visitInstanceFlow.setPositionState(source.getPositionState());
visitInstanceFlow.setPhotoState(source.getPhotoState());
visitInstanceFlow.setFormId(source.getFormId());
visitInstanceFlow.setVisitorId(user.getId());
visitInstanceFlow.setVisitorCode(user.getCode());
visitInstanceFlow.setVisitorName(user.getName());
return visitInstanceFlow;
}
public void initInputValues(BazVisitInstanceFlowBo source){
this.setTargetAddressId(source.getTargetAddressId());
//this.setFormJson(source.getFormJson());
this.setValInputValue(source.getValInputValue());
this.setValLocalX(source.getValLocalX());
this.setValLocalY(source.getValLocalY());
this.setValPhotoUrls(source.getValPhotoUrls());
this.setValFormValue(source.getValFormValue());
this.setMapAddress(source.getMapAddress());
}
}

41
src/main/java/com/qs/serve/modules/baz/entity/bo/BazCreateVisitInstanceBo.java

@ -0,0 +1,41 @@
package com.qs.serve.modules.baz.entity.bo;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访实例 Bo
* @author YenHex
* @since 2023-04-07
*/
@Data
public class BazCreateVisitInstanceBo implements Serializable {
private static final long serialVersionUID = 1L;
/** 拜访类型id */
@NotNull(message = "拜访类型id不能为空")
private Long visitId;
/** 目标id */
@NotBlank(message = "目标id不能为空")
@Length(max = 255,message = "目标id长度不能超过255字")
private String targetId;
/** 首次提交信息对象 */
private BazVisitInstanceFlowBo firstFlowSubmit;
}

69
src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowBo.java

@ -0,0 +1,69 @@
package com.qs.serve.modules.baz.entity.bo;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访流程 Bo
* @author YenHex
* @since 2023-04-07
*/
@Data
public class BazVisitFlowBo implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
private Long id;
/** 拜访id 值:1-> 网点打开 */
@NotNull(message = "拜访id不能为空")
private Long visitId;
/** 流程名称 */
@NotBlank(message = "流程名称不能为空")
@Length(max = 255,message = "流程名称长度不能超过255字")
private String flowTitle;
/** 排序 */
@NotNull(message = "排序不能为空")
private Integer flowSort;
/** 业务类型:0-普通;1->签到;2-签退;3->小结 */
@NotNull(message = "排序不能为空")
private Integer flowBizType;
/** 是否可忽略 */
@NotNull(message = "是否可忽略不能为空")
private Integer ignoreFlag;
/** 是否定位 */
@NotNull(message = "是否定位不能为空")
private Integer positionState;
/** 是否拍照 */
@NotNull(message = "是否拍照不能为空")
private Integer photoState;
/** 表单id */
private Long formId;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
}

30
src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitFlowSortBo.java

@ -0,0 +1,30 @@
package com.qs.serve.modules.baz.entity.bo;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* 拜访流程 Bo
* @author YenHex
* @since 2023-04-07
*/
@Data
public class BazVisitFlowSortBo implements Serializable {
private static final long serialVersionUID = 1L;
/** 备注 */
private List<Item> sortValues;
@Data
public static class Item{
Integer sortValue;
Long id;
}
}

61
src/main/java/com/qs/serve/modules/baz/entity/bo/BazVisitInstanceFlowBo.java

@ -0,0 +1,61 @@
package com.qs.serve.modules.baz.entity.bo;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访实例流程 Bo
* @author YenHex
* @since 2023-04-07
*/
@Data
public class BazVisitInstanceFlowBo implements Serializable {
private static final long serialVersionUID = 1L;
/** 实例的流程id(首次提交可忽略) */
@NotNull(message = "拜访实例id不能为空")
private Long instanceFlowId;
/** 目标地址id(用不上可忽略) */
@Length(max = 255,message = "目标地址id长度不能超过255字")
private String targetAddressId;
/** 输入值(用不上可忽略) */
private String valInputValue;
/** 地图地址 */
private String mapAddress;
/** 纬度 */
@Length(max = 255,message = "纬度长度不能超过255字")
private String valLocalX;
/** 经度 */
@Length(max = 255,message = "经度长度不能超过255字")
private String valLocalY;
/** 拍照图片地址 */
private String[] valPhotoUrls;
/** 表单填写json */
private String valFormValue;
/** 备注 */
@Length(max = 255,message = "备注长度不能超过255字")
private String remark;
}

57
src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitFlowSo.java

@ -0,0 +1,57 @@
package com.qs.serve.modules.baz.entity.so;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访流程 查询参数
* @author YenHex
* @since 2023-04-07
*/
@Data
public class BazVisitFlowSo implements Serializable {
private static final long serialVersionUID = 1L;
/** 拜访id */
private Long visitId;
/** 目标类型 */
private String targetType;
/** 流程名称 */
private String flowTitle;
/** 排序 */
private Integer flowSort;
/** 是否可忽略 */
private Integer ignoreFlag;
/** 是否定位 */
private Integer positionState;
/** 是否拍照 */
private Integer photoState;
/** 表单id */
private Long formId;
/** 备注 */
private String remark;
}

90
src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceFlowSo.java

@ -0,0 +1,90 @@
package com.qs.serve.modules.baz.entity.so;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访实例流程 查询参数
* @author YenHex
* @since 2023-04-07
*/
@Data
public class BazVisitInstanceFlowSo implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
private Long id;
/** 拜访实例id */
private Long visitInstanceId;
/** 拜访id */
private Long visitId;
/** 目标id */
private String targetId;
/** 目标编码 */
private String targetCode;
/** 目标名称 */
private String targetName;
/** 目标地址id */
private String targetAddressId;
/** 流程名称 */
private String flowTitle;
/** 排序 */
private Integer flowSort;
/** 是否可忽略当前流程 */
private Integer ignoreFlag;
/** 是否定位 */
private Integer positionState;
/** 是否拍照 */
private Integer photoState;
/** 表单id(0表示空值) */
private Long formId;
/** 表单Json */
private String formJson;
/** 输入值 */
private String valInputValue;
/** 纬度 */
private String valLocalX;
/** 经度 */
private String valLocalY;
/** 拍照图片地址 */
private String valPhotoUrls;
/** 表单填写json */
private String valFormValue;
/** 备注 */
private String remark;
}

74
src/main/java/com/qs/serve/modules/baz/entity/so/BazVisitInstanceSo.java

@ -0,0 +1,74 @@
package com.qs.serve.modules.baz.entity.so;
import java.time.LocalDate;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotBlank;
/**
* 拜访实例 查询参数
* @author YenHex
* @since 2023-04-07
*/
@Data
public class BazVisitInstanceSo implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
private Long id;
/** 标题 */
private String title;
/** 拜访类型id */
private Long visitId;
/** 拜访状态:0-进行中;1-完成 */
private Integer visitState;
/** 拜访人id */
private String visitorId;
/** 拜访人编码 */
private String visitorCode;
/** 拜访人 */
private String visitorName;
/** 目标id */
private String targetId;
/** 目标i编码 */
private String targetCode;
/** 目标名称 */
private String targetName;
/** 遗失定位标识 */
private Integer missLocalFlag;
private String summary;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate queryStartDate;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
private LocalDate queryEndDate;
}

14
src/main/java/com/qs/serve/modules/baz/mapper/BazVisitFlowMapper.java

@ -0,0 +1,14 @@
package com.qs.serve.modules.baz.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.baz.entity.BazVisitFlow;
/**
* 拜访流程 Mapper
* @author YenHex
* @date 2023-04-07
*/
public interface BazVisitFlowMapper extends BaseMapper<BazVisitFlow> {
}

14
src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInfoMapper.java

@ -0,0 +1,14 @@
package com.qs.serve.modules.baz.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.baz.entity.BazVisitInfo;
/**
* 供应商拜访信息 Mapper
* @author YenHex
* @date 2023-04-10
*/
public interface BazVisitInfoMapper extends BaseMapper<BazVisitInfo> {
}

14
src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceFlowMapper.java

@ -0,0 +1,14 @@
package com.qs.serve.modules.baz.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.baz.entity.BazVisitInstanceFlow;
/**
* 拜访实例流程 Mapper
* @author YenHex
* @date 2023-04-07
*/
public interface BazVisitInstanceFlowMapper extends BaseMapper<BazVisitInstanceFlow> {
}

19
src/main/java/com/qs/serve/modules/baz/mapper/BazVisitInstanceMapper.java

@ -0,0 +1,19 @@
package com.qs.serve.modules.baz.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.baz.entity.BazVisitInstance;
import com.qs.serve.modules.baz.entity.so.BazVisitInstanceSo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 拜访实例 Mapper
* @author YenHex
* @date 2023-04-07
*/
public interface BazVisitInstanceMapper extends BaseMapper<BazVisitInstance> {
List<BazVisitInstance> selectBazVisitInstanceList(@Param("query") BazVisitInstance param);
}

14
src/main/java/com/qs/serve/modules/baz/mapper/BazVisitMapper.java

@ -0,0 +1,14 @@
package com.qs.serve.modules.baz.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qs.serve.modules.baz.entity.BazVisit;
/**
* 拜访 Mapper
* @author YenHex
* @date 2023-04-07
*/
public interface BazVisitMapper extends BaseMapper<BazVisit> {
}

17
src/main/java/com/qs/serve/modules/baz/service/BazVisitFlowService.java

@ -0,0 +1,17 @@
package com.qs.serve.modules.baz.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.baz.entity.BazVisitFlow;
import com.qs.serve.modules.baz.entity.bo.BazVisitFlowBo;
/**
* 拜访流程 服务接口
* @author YenHex
* @date 2023-04-07
*/
public interface BazVisitFlowService extends IService<BazVisitFlow> {
BazVisitFlow modify(BazVisitFlowBo param);
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save