跳至主要內容

白坯织造云项目

chanchaw大约 11 分钟projs

清理垃圾

数据库日志

# 删除非花重锦账号,并且是7天前的登录请求数据
# 注意一定不能删除包含花重锦的数据,此类数据是花重锦PDA用于登录的
# 之后可能不限于 花重锦PDA01 ,如果有多个PDA则会有多个类似的数据
delete from qr_log where openid != '花重锦PDA01' and datediff(now(),create_time)>7;

# 和微信相关的 http 请求记录日志表,可以随意删除
TRUNCATE TABLE reqs_log;

报表服务

线上项目

开发环境

xdf250 服务器的路径 D:\projs\whiteaccount 下部署了完全同云端项目,访问地址 http://localhost/whiteaccount,使用的是本地 xdf250 的数据库,在目录 report 下是 FineReport 后台服务和打印模板,访问地址 http://192.168.0.250/whiteaccountr/ReportServer。有测试需求可编译后台服务 jar 更新到 D:\projs\whiteaccount\backend 下,打印模板放在 D:\projs\whiteaccount\report\WebReport\WEB-INF\reportlets 下对应账套目录下

微信

后台项目

源码仓库open in new window,其中 wxbe 分支是上线用分支,wxbedev 是开发用分支(2024年2月29日查看提交记录分支wxbe已经落后分支wxbedev很多)。微信用户数据库是 织造云数据.wechat。项目路径是 /data/extdisk/wxbe,启动命令 systemctl start wxbe

停机

由于制作最初没有设计停机功能,2025年2月21日 停机花重锦是修改表 user_millopen_id ,使其扫描登录二维码后找不到合法的 openId 进而无法登录

服务器

高松的账号申请的腾讯云服务器,IP地址是:182.xxx.xxx.227,服务器相关数据查看微信号关联的 wps 中 “账号密码箱” 的标签页 “云服务器” 中的 “织造云服务”

新用户关注注册

概述

在已登录系统的状态下,点击右上角 “扫码关注”,新用户扫描该二维码后关注,有审核权限的微信用户就会受到审核用通知消息,管理员点击模板消息后填写真实姓名保存即可。鉴定微信用户是否有审核权限的逻辑是存储过程 usp_getAuditorsInMill。其中指定了 user_mill.audit = 1 的微信用户有审核权限,即微信用户在指定的 mill 环境下有审核权限。用户取消关注时微信后台不会删除用户,该用户再次关注时后台检测到已有该用户的信息也不会重复写入,不会报错。

关注时新增用户的日志

新用户关注公众号后会调用方法 WechatOpe.java#subscribeuseruser_mill 写入新用户信息,同时写入表 reqs_log 日志,其中字段 des = 新增微信mill关系,如果微信中没有收到通知消息可到此表中查找最近的该类数据。

删除指定微信的所有数据

# 删除指定微信用户的所有数据,赋值 openId 之后执行
DELIMITER $$
SET @openId = 'oSIC353OSnMotCWuR4B2HBXL8V84';
DELETE FROM user_mill WHERE open_id=@openId;
DELETE FROM user WHERE open_id=@openId;
delete from user_permission where openid=@openId;
$$

审核模板消息详情页

/data/extdisk/jzywxfe/wx_permission.html

推送

白坯、成品推送消息内容的构建存储过程 p_wechat_push_list,要修改推送的模板消息内容,修改这个存储过程中的对应的字段内容即可

推送成品发货

发送 post 请求到地址:https://www.jzy.world/wxbe/tmpmsg/w 参数的格式如下,即 metaList 表示模板消息的内容构成的数组,数组元素是 MetaData 类型, openidList 是要推送的微信 openId 构成的数组, 最后的 templateId 是模板消息的模板编号

{
  "metaList":[
    {"value":"你有一个订单已经发货"},
    {"value":"昌越(虹桥印染)"},
    {"value":"F21070006(白坯)"},
    {"value":"MTP210010 全消光双面法兰绒 340*185 8mm 420*4 120D/192F全消光"},
    {"value":"167匹,6276.4KG,单价12.90元,金额80965.56元","color":"#FF1722"},
    {"value":"2021年07月04日"},
    {"value":"如有质量问题,请在发货后7天内通知我厂,请勿开裁!"},
    {"value":""}
    ],
  "openidList":["oSIC359AVDEo0HStiJjGEi3cDVys"],
  "templateId":"ct06WMt1UpbhUPr_u_N-y4J7uAZeHfYWrF7dZ5deOGc"
}

2021年6月27日 12:04:24 更换白坯发货模板消息的ID,完整的 post 请求如下

{
	"metaList":[
		{"value":"你有一个订单已发货"},
		{"value":"富春(苏粤印染)"},
		{"value":"F21060001"},
		{"value":"MTP210008 双面法兰绒 230g*200 5mm 430*4 120D/192F半光 "},
		{"value":"179匹,8873.4KG,单价11.3元,金额100269.42元","color":"#FF1722"},
		{"value":"2021年6月26日"},
		{"value":"如有质量问题,请在发货后7天内通知我厂,请勿开裁!"},
		{"value":""}
		],
	"openidList":["oSIC35_Oiw3iKW3AfGiQiDGoFmaw","oSIC35xmZmDLWOihqocWwHyWQjLg","oSIC351QqfdfWys65MbOEj4eGU94","oSIC3540eOSRJyPMXgffHXFyobnI"],
	"templateId":"ct06WMt1UpbhUPr_u_N-y4J7uAZeHfYWrF7dZ5deOGc"
}

前端页面

下面是白坯的前端页面 wplan.html :已排计划 worder.html :客户订单 woutput.html :日产量表 wfinance.html :应收应付 winventory.html :存货

下面是色布的页面 cplan.html : 已排计划 corder.html : 客户订单 cinventory.html : 存货

下面是原料的页面 rinventory.html : 收发存 authority.html : 权限管理 about.html :关于

项目后台

概述

后台项目路径是:/data/extdisk/whiteaccount,由于项目使用了多个配置文件,部署时没有采用外置配置文件的方案。 启动项目命令 systemctl start whiteaccount

API

外发管理

点击导入模态窗表格数据源 post 请求:productOutwardOrder/getUnImportedJRK 传入参数格式:

{"processCompname":"晨宇"}

导入的模态窗保存按钮的请求

post 请求:productOutwardOrder/insertByGatheredJrk 传入参数格式:

{"processCompanyName":"晨宇","ids":[1,2,3,4]}

业务逻辑

扫码关注

新用户扫描二维码关注后微信后台服务自动向表 user 中写入数据,记录当前微信用户,同时向管理员推送审核用的模板消息。可在该页面设置当前微信用户关联的 mill (在表 user_mill 中添加关联关系)。用户取消关注系统不会做任何操作,表 user 中仍然保留该用户的信息,当该用户再次关注时,后台服务执行关注的逻辑时在检测该用户已经存在于表 user 中则不会重复写入。

审核用的模板消息的详情页中保存关联的请求是 /userMill/save ,会先检测当前微信和指定的 mill 是否已经存在关联,不会重复写入

源码

基础资料 - 客户

contactCompany/listQuery

子菜单项图标

文件 C:\software\ideaProjs\white_account\src\main\resources\static\css\navigation.css 中注册了项目内的图标文件,后者在目录 C:\software\ideaProjs\white_account\src\main\resources\static\css\navigation 下

左侧导航菜单图标

左侧导航菜单的图标所在目录是 C:\software\ideaProjs\white_account\src\main\resources\static\jq-eject-aside\src\icons\navigation 对应的注册用文件是 C:\software\ideaProjs\white_account\src\main\resources\static\jq-eject-aside\src\css\navigation.css

新增左侧菜单项

在权限页面中增加一个菜单项,保留上级菜单为空则表示将菜单项增加到左侧导航

微信获取数据

要根据微信用户所属账套执行存储过程(有可能每个账套实现同一个业务逻辑的同名存储过程执行逻辑不同),对应的后端接口是 C:\software\ideaProjs\white_account\src\main\java\com\xdf\whiteaccount\mobilecontroller\DataGetterController.java

多数据源

实现多数据源切换的类是 C:\software\ideaProjs\white_account\src\main\java\com\xdf\whiteaccount\config\datasource\DynamicDataSource.java,这里的 CURRENT_DATASOURCE 和 STORAGE_DATASOURCE 其实保存的都是当前数据源,不过在账套切换的过程中可能导致 CURRENT_DATASOURCE 和 STORAGE_DATASOURCE 不同,后者用于将数据源切换到之前的账套上。例如,实现某个业务时需要将当前业务账套001切换到 wechat ,在执行一些逻辑后再切换回账套 001,但此时 CURRENT_DATASOURCE 已经是 wechat 了,这种情况下就要借助 STORAGE_DATASOURCE 切换回原来的数据源。对于多数据源的管理不可多次创建 DynamicDataSource 的实例,如果要使用该实例要通过调用 getInstance 获取实例对象然后再调用其他实例方法(当然静态方法可直接调用了)。数据源切换是通过切片 C:\software\ideaProjs\white_account\src\main\java\com\xdf\whiteaccount\aop\DynamicDataSourceAspect.java 中定义的每个方法。这些方法的注解定义了在哪些包下进行数据源的切换,所以有新业务要制作保证在现有包结构下新增文件。

自定义权限

在表 sys_permission 中新增一个字段,在 C:\software\ideaProjs\white_account\src\main\java\com\xdf\whiteaccount\config\ShiroRealm.java 的方法 getPermissions 中追加新的自定义权限。

计划管理

  • html - templates/pages/jh/jh_plan_report.html
  • js - static/js/pages/jh/jh_plan_report.js
白坯计划
  • templates/pages/jh/jh_plan_report.html
  • static/js/pages/jh/jh_plan_report.js
  • 序时表表格请求调用的存储过程:p_plan_report
  • 查看明细 右键菜单中的项目“查看明细”是在 js 文件中生成的对话框,其 id = "input_form",通过搜索该 ID 找到初始化模态窗数据的请求是 plan/report/detail/{id},一个请求响应来对话框中的所有数据,包括下面表格内的数据,请求所在控制器是 com.xdf.whiteaccount.controller.PlanController.getPlanDtl,对应的 mapper.xml 是mapping/CallMapper.xml,存储过程是 p_plan_dtl
  • 白坯计划序时表 - 选中行右键菜单“查看明细” - 库存数据 - p_plan_storage_modify
  • 白坯计划序时表 - 选中行右键菜单“查看明细” - 表格上面表单数据 - p_plan_dtl
移库弹出模态窗

表格数据源请求 - post: url - plan/reportExclude 参数格式 - {'id':'2'} 返回结果 - 返回所有未完工的白坯计划,排除参数中的主键值的计划 数据源存储过程 p_plan_report 沿用小张的,在 java 过滤掉用排除的计划

执行移库

后端请求 - post url - jrkbillAdjust/migrateStock 参数格式 - {"ido":"2","idt":"3","pairs":"11","qty":"22"} ido - 源计划主键 idt - 目标计划主键 pairs - qty - 移库的匹数和公斤 正数表示从 ido 转出给 idt ,负数则相反

成品计划序时表
  • 前端 JS 文件:src/main/resources/static/js/pages/jh/jh_dye_plan_report.js。
  • 序时表表格数据的请求 dyeFabricPlan/report
  • 表格数据调用的存储过程:p_dye_fabric_plan_report
  • 右键查看明细的代码在行号 1159,请求后端数据是将3个表格以及上面计划信息一起获取然后在前端分离显示。后端数据的请求是:dyeFabricPlan/report/detail/ 控制器是 src/main/java/com/xdf/whiteaccount/controller/DyeFabricPlanController.java 的方法 getPlanDtl 调用的存储过程是:p_dye_plan_dtl
  • 序时表上方工具栏中按钮“订单完成”执行的请求是 dyeFabricPlan/finished。执行的控制器是 src/main/java/com/xdf/whiteaccount/controller/DyeFabricPlanController.java 中的方法 setFinishedState
  • 取消审核的请求是 dyeFabricPlan/cancelAudit,控制器是 src/main/java/com/xdf/whiteaccount/controller/DyeFabricPlanController.java 对应的方法 cancelAuditByPrimaryKey
  • 新增 / 修改单据的请求:dyeFabricPlan/insertSelective 和 dyeFabricPlan/updateSelective

外发管理

坯布入库

表格数据源存储过程:p_product_inbound_report。该存储过程在 2021年8月22日 14:22:02 追加字段 mode ,是枚举体:手动输入、自动导入。前端获取数据的字段为该存储过程的字段 点击导入弹出的模态窗表格的数据源存储过程是 usp_getUnImportedJRK 删除的请求 - post:productOutwardOrder/cancelByPk 参数名:id 保存导入数据的接口 - post:productOutwardOrder/mapping8jrk 传入参数:

{'processCompanyName':'晨宇','ids':ids}
白坯管理

html 页面:templates/pages/jh/jh_plan_report.html 对应的 js 文件:static/js/pages/jh/jh_plan_report.js 表格数据的请求:plan/report 对应的后端控制器:com.xdf.whiteaccount.controller.PlanController.getPlanReport 服务层实现类:com.xdf.whiteaccount.service.impl.CallServiceImpl.getPlanReport 对应的 Mapper 方法:mapping/CallMapper.xml.getPlanReport 使用存储过程:p_plan_report

白坯计划序时表右键菜单的“查看明细”中3个标签页的数据源是一个请求: com.xdf.whiteaccount.controller.PlanController.getPlanDtl 其中库存调整的数据源是:com.xdf.whiteaccount.dao.CallMapper.getPlanStorageModify 对应的存储过程是:p_plan_storage_modify 手动调整白坯库存的表是 jrkbill_adjust

部署与实施

启动与停止

  1. 将最新 jar 拷贝到目录 /data/extdisk/whiteaccount 下
  2. 通过命令 ps -aux|grep white-account 检查后台服务进程号
  3. 通过命令 kill -15 进程ID 关闭后台服务
  4. 修改第1步中的 jar 文件为:white-account.jar
  5. 将下面命令拷贝到 xshell 回车执行 - 启动服务
    nohup java -jar /data/extdisk/whiteaccount/white-account.jar > /data/extdisk/whiteaccount/runtime.log 2>&1 &
    
  6. 使用命令 ps -aux|grep white-account 检查服务是否正常启动
  7. 浏览器登录系统测试
  8. 想要制作 systemd 服务自启动,但是由于使用了多配置文件导致没有制作成功,所以采用上面的手动启动方法 自启动服务在 /usr/lib/systemd/system

本地测试

保证项目微信账号数据库指向云端,业务数据库指向本地,启动项目后可正常获得登录二维码,操作的数据影响的是本地的数据库 - 映射关系仍然使用云端指定的。 即本地开发并测试使用后面注释是:“本地” 的一套配置文件 生产环境要切换为“正式服务器” 注意本地要有配套业务数据库

改善计划

2026年3月28日 16:37:49

本次为齐力达制作推送的白坯发货推送模板消息中追加显示 客户单号 时发现新部署的项目启动后不会自动创建所有账套的数据源,会导致此时如果有009账套的发货单生成,后台在遍历数据源时由于没有009的数据源导致无法推送模板消息,在生成发货单之前有该账套的用户登录系统,系统会自动创建数据源,则生成发货单后能够正常推送模板消息