微信
概述
推送消息
服务支持
依次检查下面要素,保证推送消息可正常运行
云服务器 染厂云 处于
10.8.x.x网络中,微信后台服务在运行保证
ERP服务器处于10.8.x.x的openvpn网络中,执行ping 10.8.2.2有响应则表示网络通畅ERP服务器开启后台服务data_transmitter。注意如果太久没有开启该服务,注意查看下面的 按照日期屏蔽推送消息 后再开启本服务,微信有控制每天发送模板消息的阈值,超过后不允许再推送消息
推送白坯
线下服务器的 ERP 中会推送白坯入库的单据数据到云服务器表 bp_pushlist_dtl ,云服务器后台推送微信模板消息给染厂客户的微信,点击模板消息后跳转到 html 页面显示白坯的明细数据,该 html 页面的数据源是云服务器存储过程 usp_GetPushDtlWhite
- 天天虹/鑫建印染,2026年3月15日 客户反应白坯明细数据页面没有显示白坯品名,原因是
bp_pushlist_dtl.product中没有数据,即线下服务器推送云端数据库时没有给该字段合适的数据,要修改线下ERP推送的数据,不可修改云端存储过程,有的客户使用的是白坯品名,有的使用的是品种,如果修改云端则会影响所有用户
推送逻辑
本地数据上传云服务器
在线下 ERP 数据库中有表 upload_record 记录上传数据的进度,记录 g_cjflowbilldetailprocess 的主键,表示当前上传数据的最大主键,下次上传大于其的刷卡产量数据。在本表中手动新增一行数据,填写主键后可控制本地上传从什么时间开始的数据
记录 g_jrkbill 主键,表示当前上传打卷数据的最大主键值
屏蔽推送消息
通过设置 user_mill.effective = 0 可以屏蔽指定染厂的推送消息
按照日期屏蔽推送消息
执行下面脚本可屏蔽指定日期之前的所有没有推送的数据,如果长期没有推送数据,先执行下面脚本控制本日推送消息的数量,防止一天推送过多消息达到阈值后,其他有效消息无法推送
update client_pushlist set status = 1,push_count = 1 where mill = '新泰印染' and finish_date < '2025-12-01 00:00:00';
update client_pushlist_detail set status = 1 where mill = '新泰印染' and finish_date < '2025-12-01 00:00:00';
清理数据库垃圾
# 清除所有日志数据(无关业务)
DELIMITER $$
TRUNCATE TABLE log_runtime;
TRUNCATE TABLE call_template_msg_res;
TRUNCATE TABLE heart_beat;
$$
开发文档
扫一扫
概述
微信扫一扫可以实现在微信服务号中打开手机摄像头同时扫描一维码二维码,有两种处理扫描结果的方式,默认0表示扫描结果由微信处理,1表示将结果返回给前端页面由开发者自己处理。注意微信公众号平台中设置 JS接口安全域名 调用地址不要有协议名称,只要域名即可:www.xdfznh.club
实现步骤
- 请求或者 access_toke 拿微信服务号的 appId 和 secret 替换掉连接 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 中的两个同名的大写的单词(红色字体),发送 get 请求,微信服务器会返回一个 json 对象(字符串),其中的属性 access_token 就是你想要的 token 了,还有个属性 expires_in 是该 token 的过期时间,单位是秒(默认7200秒),微信开发中很多地方会用到这个 token 所以有必要将他缓存起来,当过期后重新请求,没过期的话要保证使用暂存的 token
- 请求获取调用 jsapi 的 ticket 将这个URL :https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi 的红色字体替换为第一步中获取的 access_token 发送 get 请求,返回的对象结构如下。其中的 ticket 就是之后调用 jsapi 需要用到的票据,属性 expires_in 表示过期时长,默认7200秒(和上面的 access_token 一样)。
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
- 拼接字符串后使用SHA1加密 按照格式:jsapi_ticket=PA&noncestr=PB×tamp=PC&url=PD 构建出一个字符串,然后使用SHA1加密,返回给下一步使用。上面红色字体是4个参数,PA 就是前面第二步中获取的 ticket,PB可以是任意字符串,不过一般使用UUID(看自己喜欢,固定一个字符串也可以),PC是时间戳,不过这个时间戳要除以1000。默认JAVA时间戳单位是毫秒,而微信使用的单位是秒,所以要除以1000。PD是调用扫一扫功能的前端页面的完整URL,这里特别要注意,看官方文档他会提示你URL后面微信会自动添加上 /,但是自己开发时千万不要手残手动给URL后面追加一个 /,例如当前调用扫一扫功能页面的前端地址是:https://www.xdfznh.club/wxpadfe/wx/wxscan,直接使用这个地址在微信开发者工具中测试是通过的,但是放到手机微信上就死活不通过。。。原来手机微信会自动在网址后面追加两个参数:code=xxxxx&state=1,所以前端传递给后端页面地址时需要先将这两个参数获取出来拼接起来发送给后端,拼接后的效果是:https://www.xdfznh.club/wxpadfe/wx/wxscan?code=xxx&state=1。注意Springboot 接收这个地址的参数需要额外处理,因为 restful 默认 / 是隔离参数用的,这里多次出现该符号导致请求提示404,那么后端不可像其他接口一样接收参数,应该这样接收:
@GetMapping("/getWxJsApiConfigs/**")
public JsonResult getWxJsApiConfigs(HttpServletRequest req) throws IOException {
log.info("传入参数是:"+req.toString());
String path = req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
String path2 = req.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();
String param = new AntPathMatcher().extractPathWithinPattern(path2,path);
前端即使将 https:// 变更为 https:/// ,后端接收到的参数依旧是 https:/ ,所以可以通过截取前面的协议名称,后面的双 /就手动拼接好了。拼接后的字符串使用SHA1加密,官方提供了JAVA版本的案例可以直接拷贝官方的案例。
- 拼接为最终结果对象 最终返回给前端的对象模型是:
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
该模型中的 timestamp 、nonceStr 要使用构建加密字符串中的数值,否则导致不一致,参数 signature 就是使用 SHA1加密后的字符串,由于本案例只使用扫一扫功能,那么最后的 jsApiList 可以填写为:["scanQRCode"]。构建该对象后返回给前端。
- 前端注册 前端拿到前一步中获得的对象后使用方法
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
向微信服务器注册想要使用的功能,当后端返回OK后就可以调用想要的功能了。该方法的两个回调方法分别是下面两段代码
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
分别对应请求成功和失败的回调。直接将这两个方法顺序放在方法 wx.config 后面即可。如果要注册成功后立即调用 jsapi 那么可以将方法放到上面的 wx.ready 方法内部。
坑
- 手机微信会在当前页面后面自动追加两个参数 : code=xxx&state=1,但是开发者工具不会。如果不知道这点会有点郁闷,明明开发者工具测试可以的拿到手机上就不行。
- 用于请求 jsapi 的 url 要带前面的协议,即 https,但是不要在 url 最后添加 /
Angular 中引用 js
- npm 安装
cnpm install weixin-js-sdk --save
cnpm install @types/node --save-dev
- 调用页面声明并使用
import * as wx from 'weixin-js-sdk';
- 声明后就可以像官方使用方法一样了:
wx.config({// 请求成功后应用配置
debug:true,
appId:this.jsApiConfig.appId,
timestamp:this.jsApiConfig.timestamp,
nonceStr:this.jsApiConfig.nonceStr,
signature:this.jsApiConfig.signature,
jsApiList:['checkJsApi','scanQRCode']
});
JS - JQuery 版本
var users = null;
var configs = null;
var config = null;
const url_planInfo = "https://www.xdfznh.club/wxpadbe/execute/query/华宇印染/select * from plan where vatNum='{{vatNum}}'";
function getCurPageUrl(){
return window.location.href;
}
function reqConfigs(){// 请求后端配置对象构成的数组
let that = this;
const url_configs = 'https://www.xdfznh.club/wxpadbe/wx/getWxJsApiConfigs/' + getCurPageUrl() ;
$.ajax({
type : "GET",
contentType: "application/json;charset=UTF-8",
url : url_configs,
success : function(res){// 返回的数据是配置对象构成的数组,取下标2
that.configs = res.data;// 全局保存配置对象数组
that.config = res.data[2];
that.applyConfigs(res.data[2]);
},
error : function(e){//请求失败,包含具体的错误信息
alert(e.status + ':' + e.responseText);
}})
}
function applyConfigs(conf){
let self = this;
wx.config({
debug:false,
appId:conf.appId,
timestamp:conf.timestamp,
nonceStr:conf.nonceStr,
signature:conf.signature,
jsApiList:['checkJsApi','scanQRCode']
});
wx.ready(function(){
self.wxScan();
})
}
function wxScan(){// 调用扫一扫
let that = this;
wx.scanQRCode({
needResult: 1,
scanType: ["qrCode","barCode"],
success: function(res){
let vatnum = that.getVatnum(res);
that.getPlanInfo(vatnum);
}
});
}
// 扫描后返回的结果处理后返回缸号
function getVatnum(data){
if( data.length <=0 ) return '';
let arr = data.resultStr.split(",");
return arr[1];
}
function getPlanInfo(vatnum){
const url = url_planInfo.replace('{{vatNum}}',vatnum);
$.ajax({
type : "GET",
contentType: "application/json;charset=UTF-8",
url : url,
success : function(res){// 返回的数据是配置对象构成的数组,取下标2
alert('请求来的缸单信息是:' + JSON.stringify(res));
},
error : function(e){//请求失败,包含具体的错误信息
alert(e.status + ':' + e.responseText);
}})
}
调用官方JS-SDK
概述
- 使用微信开发者信息使用 get 方法向微信服务器请求 access_token (默认有效期7200秒,做好全局缓存,每天有请求次数限制)
- 拿第一步中获得的 access_token 一样通过 get 方法请求获取 jsapi_token (也是默认有效期7200秒,做好全局缓存)。替换请求 https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi 中的ACCESS_TOKEN 后使用 get 请求,服务器返回的结果如下:
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
其中的 ticket 就是“票据”了。
- 拿上一步获得的“票据”生成“签名”,将该签名填入下面的配置参数中
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的JS接口列表
});
生成签名的算法: 生成签名的参数有:noncestr、jsapi_ticket、timestamp、url,使用键值对的方式,每个键值对中间使用 & 作为连接符(类似 url 中的参数),这些参数必须按照顺序:jsapi_ticket、noncestr、timestamp、url 的顺序连接,比如当前参数如下:
noncestr=chanchaw
jsapi_ticket=imjsapi_ticket
timestamp=18101577776
url=http://mp.weixin.qq.com?mill=byl
那么将这些参数拼接为:string1 = jsapi_ticket=imjsapi_ticket&noncestr=chanchaw×tamp=18101577776&url=http://mp.weixin.qq.com?mill=byl 然后对 string1 使用 sha1 得到最终 signature(这里假如结果是aabbcc)。那么填充上面的参数是:
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '微信官方给你的', // 必填,公众号的唯一标识
timestamp: 18101577776, // 必填,生成签名的时间戳
nonceStr: 'chanchaw', // 必填,生成签名的随机串
signature: 'aabbcc',// 必填,签名
jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表,本次试验使用扫一扫功能
});
- 当 url 变动时就要重新填写该配置参数,然后才能调用 js 接口
- 官方关于该部分功能地址是:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62
开发工具
服务器相关
删除微信用户关联染厂
删除指定微信用户和指定染厂的所有关联数据
# 清除用户与染厂关联
set @userId = 1283;
set @mill = '利丰';
set @openId = (select weixin_name from user_weixin where id = @userId);
# 删除客户权限映射
delete from sys_userpermission where openid = @openId and mill = @mill;
# 删除客户映射
delete from user_convent
where user_weixin_id = @userId
and client_id in (
select id from client where mill = @mill
);
# 删除染厂映射
delete from user_mill where openid = @openId and mill = @mill;
删除无效染厂的映射
# 删除所有无效染厂的映射
DELIMITER $$
# 删除染厂映射
delete from user_mill where mill in (select sid from mill where mill.effective=0);
# 删除权限
delete from sys_userpermission where mill in (select sid from mill where mill.effective=0);
$$
取消企业云查看报表权限
# 关闭指定微信号企业云权限
# 将多个 openid 以英文逗号间隔赋值给 @openIds
DELIMITER $$
SET @openIds = '';
UPDATE sys_userpermission SET valid=0,rpt_bp=0,rpt_cp=0,rpt_metal=0,rpt_dye=0,
auth_report=0,auth_energy=0
WHERE openid IN (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@openIds,',',help_topic_id+1),',',-1) AS openId
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(@openIds)-LENGTH(REPLACE(@openIds,',',''))+1
);
$$
删除历史数据
# 删除指定染厂的白坯单据数据
DELETE FROM bp_pushlist_dtl WHERE mill IN ('新东方','新东方智能化');
DELETE FROM bp_pushlist_main WHERE client IN ('新东方','新东方智能化');
清空日志文件内容
cat /dev/null > /projs/wxpadLogs/alarm.log
cat /dev/null > /projs/wxpadLogs/entryController.log
cat /dev/null > /projs/wxpadLogs/event.log
cat /dev/null > /projs/wxpadLogs/manager.log
cat /dev/null > /projs/wxpadLogs/permission.log
cat /dev/null > /projs/wxpadLogs/push.log
cat /dev/null > /projs/wxpadLogs/scan.log
cat /dev/null > /projs/wxpadLogs/service.log
cat /dev/null > /projs/wxpadLogs/wxController.log
cat /dev/null > /projs/wxpadLogs/wxJsApi.log
cat /dev/null > /projs/wxpadLogs/wxpad.log
ERP相关
初始化所有客户两个工序
# 给所有客户设置工序映射
DELIMITER $$
DELETE FROM process_mapping WHERE 1=1;
INSERT INTO process_mapping
(client_id, client_name, process_name)
SELECT a.sId,a.name,b.name
FROM contactcompany a
LEFT JOIN (SELECT * FROM process WHERE name IN ('白坯预定','染色')) b
ON 1=1
;$$
DELIMITER ;
云端
推送相关
推送成品发货模板消息
- 查询获取等待推送的数据源存储过程:
usp_GetUnpushedCP - 在循环推送过程中通过调用存储过程
usp_SelectOpenIds查询获取拥有指定客户映射关系的 openId 才对其进行推送。这里多次出现利丰的问题,新添加客户在 erp 端会立即同步到云端微信数据库中,但是由于种种原因偶尔出现新客户没有成功推送到云端数据库导致推送发货消息时没有推送给小郭和老板娘,在 2022.10 更新了该存储过程,在字段user_phone =1的用户无条件推送所有消息。
手动推送发货单
# 填写两个参数:@dyeName,@clientName
# 保证该名称的客户唯一
# 执行完毕下面所有代码获得该客户的所有成品发货单倒排序
SET @dyeName = '朗迪印染';
SET @clientName = '双叶';
SET @likeClientName = concat('%',@clientName,'%');
set @clientId = (SELECT id FROM client WHERE mill = @dyeName AND client_name LIKE @likeClientName);
SELECT * FROM sendout_main WHERE mill=@dyeName AND client_id=@clientId ORDER BY id DESC LIMIT 100;
手动推送白坯
# 重新推送成品发货单 - 指定染厂指定客户
CALL usp_repushSendout('银海印花','洋科');
# 重新推送成品发货单 - 最后一单
CALL usp_repushSendoutLast('银海印花');
# 重新推送白坯入库单 - 指定染厂指定客户
CALL usp_repushBP('银海印花','洋科');
# 重新推送白坯入库单 - 最后一单
CALL usp_repushBPLast('银海印花');
视图中间件
vw_user_convent
权限相关
# 删除染厂及其相关的所有数据
set @mill = '昆山针织';
START TRANSACTION;
delete from user_convent where client_id in (
select id from client where mill = @mill
);
delete from client where mill = @mill;
delete from mill where sid = @mill;
delete from client_pushlist where mill = @mill;
delete from client_pushlist_detail where mill = @mill;
delete from bp_pushlist_main where client = @mill;
delete from bp_pushlist_dtl where mill = @mill;
delete from user_mill where mill = @mill;
COMMIT ;
# 设置微信用户在客户云只可见一个客户
# 删除与客户的映射关系后重建(删除所有客户映射关系)
# 删除与客户的权限关系后重建(删除所有权限关系)
# 如不要删除数据见下面第三个工具sql
###########################################################################
# MYSQL
DROP PROCEDURE IF EXISTS `usp_setClientCloudOnlyOne`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_setClientCloudOnlyOne`(IN openId VARCHAR(100),IN clientId INT)
BEGIN
# 2024年11月4日 10:58:50 设置微信用户在客户云中只有一个映射关系
START TRANSACTION ;
select id,user_logname,user_name into @userId,@nickName,@realName from user_weixin where weixin_name = openId;
select client_name,mill into @clientName,@mill from client where id = clientId;
# 1. 先删除该微信用户下的所有客户映射关系
delete from user_convent where user_weixin_id = @userId;
# 2. 重新写入当前指定的一个客户
insert INTO user_convent
(client_id, user_weixin_id, valid)
values
(clientId,@userId,1);
# 3. 删除微信用户的所有客户权限
delete from sys_userpermission where openid = openId and mill = @mill and client_name = @clientName;
# 4. 重新写入指定的一个客户的权限
insert into sys_userpermission
(openid, wechat_name, client_sid, client_name, auth_bp, auth_cp, auth_process, process, mill, wechat_logname, rpt_bp, rpt_cp, rpt_metal, rpt_dye, auth_report, auth_energy, customer_inventory, customer_inout, customer_progress, customer_order, perm_delete, valid)
select @openId,@realName,a.client_nickname,a.client_name,1,1,1,'无',@mill,@nickName,1,1,1,1,1,1,1,1,1,1,false,true
from client a where id = clientId;
COMMIT ;
END;$
# 查询指定微信是否拥有指定客户的权限
###########################################################################
DELIMITER $$
set @openId='ovC8bs78-EymCeGDgtycJKOXGTh0';
set @mill='新达印染';
set @clientName='三荣';
select * from vw_user_convent
where 1=1 and openId=@openId
and mill=@mill and erpClientName like '%三荣%'
;
$$
# 客户云只显示一个客户
# 设置只查看指定客户(客户云中),禁用其他所有客户
###########################################################################
DELIMITER $$
START TRANSACTION;
set @openId='ovC8bs78-EymCeGDgtycJKOXGTh0';
set @mill='新达印染';
set @clientName='三荣';
# 设置所有关系为不可用
update user_convent a
join vw_user_convent b on a.id = b.id
set a.valid = 0 where b.openId = @openId;
# 启用指定的一个客户为可用
Update user_convent a
join vw_user_convent b on a.id = b.id
set a.valid = 1
where b.openId = @openId
and b.mill = @mill and b.erpClientName = @clientName
;
COMMIT;
$$
# 更新指定染厂本厂用户的所有权限
# 存储过程 usp_setEnterpriseCloudAll 更新指定染厂下的所有本厂用户的权限 - 解决新增客户没有推送权限的问题,源码如下:
###########################################################################
create definer = root@`%` procedure usp_setEnterpriseCloudAll(IN millName varchar(50))
BEGIN
# 2022年8月15日 08:57:56 刷新指定染厂下的所有 “本厂” 微信号的权限
# 线下服务器新增客户后调用云端本方法更新微信用户权限
# 只更新现有用户的权限,不会新增用户,所以不用设置用户真实姓名
# 执行的逻辑如下:
# 1. 清空该染厂名下所有“本厂”用户在表 user_convent 中的映射关系后重建
# 2. 清空该染厂名下所有“本厂”用户在权限表 sys_userpermission 中的数据
# 2.1. 重建非本厂数据保证白坯、成品推送
# 2.2. 重建本厂数据保证微信报表权限
START TRANSACTION ;
# 查询获取染厂下的所有“本厂”微信用户
SET @millbclike = concat(millName,'%本厂');
drop temporary table if exists user_bc;
CREATE TEMPORARY TABLE user_bc(# 指定缸号的所有兄弟缸号
id BIGINT,openid VARCHAR(50)
);
INSERT INTO user_bc
SELECT id,weixin_name FROM user_weixin WHERE qr_scene_str like @millbclike;
# 3. 清空该染厂下的所有“本厂”微信的客户关联,然后重新创建该微信用户群的所有客户关联
DELETE FROM user_convent
WHERE user_weixin_id IN (SELECT id FROM user_bc)
AND client_id IN (
SELECT id FROM client WHERE mill = millName
);
INSERT INTO user_convent
(client_id,user_weixin_id)
SELECT b.id,a.id
FROM user_weixin a
CROSS JOIN (
SELECT * FROM client WHERE mill = millName
) b
WHERE a.id IN (SELECT id FROM user_bc);
# 4. 保证白坯+成品推送有权限
DELETE FROM sys_userpermission WHERE openid IN (SELECT openid FROM user_bc) AND client_name != '本厂' AND mill = millName;
INSERT INTO sys_userpermission
(openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_process,
mill,wechat_logname,rpt_bp,rpt_cp,rpt_metal,rpt_dye,auth_report,auth_energy)
SELECT b.weixin_name,b.user_name,a.client_nickname,a.client_name,1,1,1,
a.mill,b.user_logname,0,0,0,0,0,0
FROM client a
CROSS JOIN (
SELECT *
FROM user_weixin where weixin_name IN (SELECT openid FROM user_bc)
) b
WHERE a.mill = millName;
# 5. 保证可以看微信上本厂的报表
DELETE FROM sys_userpermission WHERE openid IN (SELECT openid FROM user_bc) AND client_name = '本厂' AND mill = millName;
INSERT INTO sys_userpermission
(openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_process,
mill,wechat_logname,rpt_bp,rpt_cp,rpt_metal,rpt_dye,auth_report,auth_energy)
SELECT b.weixin_name,b.user_name,'0000','本厂',1,1,1,
a.mill,b.user_logname,1,1,1,1,1,1
FROM (
SELECT millName AS mill
) a
CROSS JOIN (
SELECT *
FROM user_weixin where weixin_name IN (SELECT openid FROM user_bc)
) b;
COMMIT ;
END;
# get 请求是:`[https://www.xdfznh.club/wxpadbe/dev/setEnterpriseCloudAll/](https://www.xdfznh.club/wxpadbe/dev/setEnterpriseCloudAll/)利丰印染`
# 本厂用户缺少的权限
# 一般由于线下ERP服务器新增客户导致云端拥有本厂权限的微信用户没有得到新客户的权限,该存储过程查询获取遗漏的权限 - 主要是无法收到成品发货的推送消息
# MYSQL
DROP PROCEDURE IF EXISTS `usp_getMissedPermission`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_getMissedPermission`(IN vMill VARCHAR(100),IN vQrScene VARCHAR(100))
BEGIN
# 2022年10月27日 08:11:31
# uer_weixin 中 qr_scene_str 是本厂的用户应该拥有所有客户的权限在表 user_permission
# 本存储过程用于检查返回遗漏了哪些客户的权限
drop temporary table if exists wechatUsers;
CREATE TEMPORARY TABLE wechatUsers(# 指定缸号的所有兄弟缸号
id INT,nickName VARCHAR(100),realName VARCHAR(100),openId VARCHAR(100)
);
# 所有处于关注状态的,有接受消息权限的,本厂人员
insert into wechatUsers
select id,user_logname,user_name,weixin_name from user_weixin where status = 1 and receive = 1 and qr_scene_str = vQrScene;
# 构建上一步微信用户拥有的所有权限
drop temporary table if exists existsPermission;
CREATE TEMPORARY TABLE existsPermission(
id int,openId VARCHAR(100),clientSid VARCHAR(100),clientName VARCHAR(100)
);
insert into existsPermission
select id,openid,client_sid,client_name from sys_userpermission where openid in (select openId from wechatUsers);
# 对比获取遗漏的权限
select a.openId,a.clientId,a.client_nickname,a.client_name from (
select a.id,a.openId,b.id as clientId,b.client_nickname,b.client_name
from wechatUsers a
CROSS JOIN client b
where b.mill = vMill
) a
LEFT JOIN existsPermission b
on a.openId = b.openId and a.client_nickname = b.clientSid and a.client_name = b.clientName
where b.clientSid is NULL
ORDER BY a.openId,a.clientId,a.client_nickname,a.client_name
;
END;$
# 查看微信用户权限
# 查看微信用户的推送权限
DELIMITER $$
set @clientName = '硕博';
set @clientLike = concat('%',@clientName,'%');
drop temporary table if exists users;
CREATE TEMPORARY TABLE users(# 指定缸号的所有兄弟缸号
id INT,user_logname VARCHAR(100),
user_name VARCHAR(100),weixin_name VARCHAR(100),
status INT,receive INT,receive_process INT,
receive_bp INT,receive_cp INT,qr_scene_str VARCHAR(100)
);
insert into users
select id,user_logname,user_name,weixin_name,status,receive,
receive_process,receive_bp,receive_cp,qr_scene_str
from user_weixin where qr_scene_str like @clientLike;
select * from users;
select * from user_mill where openid in( select weixin_name from users);
select * from user_convent where user_weixin_id in (select id from users) LIMIT 100;
select * from sys_userpermission where openid in (select weixin_name from users);
$$
# 染厂改名
# 修改用户染厂关联表
UPDATE user_mill SET mill='香缘里' WHERE mill = '香山印染';
# 修改权限表中的名称
UPDATE sys_userpermission SET mill='香缘里' where mill='香山印染';
# 指定客户云权限
# 核心存储过程
call usp_setClientCloud(mill,openId,clientId,真实姓名);
# 执行前查询指定客户是否存在
DELIMITER $$
SET @mill = '白玉兰';
SET @openId = 'ovC8bs0FBLpFy_uq2FR03NvimEsQ';
SET @clientName = '凯欣达-2';
SELECT * FROM client
WHERE mill=@mill AND client_name LIKE concat('%',@clientName,'%');
$$
# 给微信客户云权限
DELIMITER $$
SET @mill = '白玉兰';
SET @openId = 'ovC8bs0FBLpFy_uq2FR03NvimEsQ';
SET @clientName = '凯欣达-2';
SET @clientId = (SELECT id FROM client
WHERE mill=@mill AND client_name = @clientName);
call usp_setClientCloud(@mill,@openId,@clientId,@clientName);
$$
# 指定企业云权限
# 参数依次是:染厂名称、微信openid、真实姓名
call usp_setEnterpriseCloud(mill,openId,realName);
# 赋予能源监控权限
# 赋予能源监控权限
DELIMITER $$
SET @openId='ovC8bs1pQ7YMjKXj60NMy1-DQ-7o';
SET @mill = '新盛针纺';
# 重置染厂映射
DELETE FROM user_mill WHERE openid=@openId AND mill=@mill;
INSERT INTO user_mill (openid, mill, alarm_gas)
VALUES (@openId,@mill,1);
# 重置本厂权限
DELETE FROM sys_userpermission WHERE openid=@openId AND mill=@mill AND client_name='本厂';
INSERT INTO sys_userpermission
(openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_process,process,mill,
wechat_logname,rpt_bp,rpt_cp,rpt_metal,rpt_dye,auth_report,auth_energy,customer_inventory,
customer_inout,customer_progress,customer_order,create_time)
SELECT openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_process,
process,'白玉兰',wechat_logname,rpt_bp,rpt_cp,rpt_metal,rpt_dye,auth_report,
auth_energy,customer_inventory,customer_inout,customer_progress,customer_order,
create_time
FROM sys_userpermission
WHERE openid=@openId AND mill=@mill
AND client_name='本厂';$$
DELIMITER ;
# 开通客户云所有权限 - 现有映射关系
# 给指定微信当前所有客户映射客户云权限
set @openId = 'ovC8bs78-EymCeGDgtycJKOXGTh0';
UPDATE sys_userpermission SET customer_inout=1,customer_inventory=1,customer_order=1, customer_progress=1 WHERE openid=@openId;
# 删除指定染厂下的白名单之外的所有其他客户
# 删除指定微信在客户云中的映射关系
# 1. 指定染厂下设置白名单
# 2. 删除该染厂下的所有其他客户的映射关系
# 3. 必填参数:openId,染厂名称,客户名称的白名单
DELIMITER $$
set @openId = 'ovC8bs78-EymCeGDgtycJKOXGTh0';
set @mill = '朗迪印染';
set @userId = 0;
SELECT id INTO @userId FROM user_weixin WHERE weixin_name=@openId;
-- 删除权限
DELETE FROM sys_userpermission WHERE openid='ovC8bs78-EymCeGDgtycJKOXGTh0'
and mill=@mill AND client_name NOT IN ('徐静亚','鼎润');
-- 删除客户映射
DELETE FROM user_convent WHERE user_weixin_id=@userId
AND client_id IN (
SELECT id FROM client WHERE mill=@mill
)
And client_id NOT IN (
SELECT id FROM client WHERE mill=@mill
AND client_name IN ('徐静亚','鼎润')
);$$
# 设置指定微信接受所有染厂报警
UPDATE user_mill SET alarm_gas=1 WHERE openid='ovC8bs78-EymCeGDgtycJKOXGTh0';
# 删除微信和指定染厂的所有关联
# 删除指定微信指定染厂的所有关联
DELIMITER $$
SET @openId='ovC8bs78-EymCeGDgtycJKOXGTh0';
SET @mill = '朗迪印染';
SET @wxid = 0;
SELECT id INTO @wxid FROM user_weixin WHERE weixin_name=@openId;
# 删除该染厂下的所有客户权限
DELETE FROM sys_userpermission WHERE mill=@mill AND openid=@openId;
# 删除微信和染厂客户的关联
delete FROM user_convent WHERE user_weixin_id = @wxid AND client_id IN (
SELECT client.id FROM client WHERE mill=@mill
);
# 删除微信和染厂的关联
DELETE FROM user_mill WHERE openid=@openId AND mill=@mill;$$
DELIMITER ;
# 删除指定微信指定染厂内其他所有客户关联
# 删除其他所有客户映射关系
DELIMITER $$
SET @openId = 'ovC8bs1pQ7YMjKXj60NMy1-DQ-7o';
SET @wxPK = 0;
SET @mill = '新达印染';
SELECT id INTO @wxPK FROM user_weixin WHERE weixin_name=@openId;
# 删除映射关系
DELETE FROM user_convent WHERE user_weixin_id=@wxPK AND client_id IN (
SELECT client.id FROM client WHERE mill=@mill AND client_name NOT IN ('曹利宇','陈春发(新车间)','戴仁义','东贝')
);
# 删除权限
DELETE FROM sys_userpermission WHERE openid=@openId AND mill=@mill
AND client_name NOT IN ('曹利宇','陈春发(新车间)','戴仁义','东贝','本厂');$$
DELIMITER ;
# 删除指定微信指定染厂之外的所有关联
DELIMITER $$
SET @openId = 'ovC8bs1pQ7YMjKXj60NMy1-DQ-7o';# 微信用户的 openid
SET @id = 125;# 表 user_weixin 中的自增主键
SET @mill = '新达印染';
SELECT id INTO @id FROM user_weixin WHERE weixin_name=@openId;
DELETE FROM scan_scene WHERE openid = @openId;# 删除场景值
DELETE FROM user_mill WHERE openid = @openId AND mill !=@mill;# 删除用户和染厂的关联
DELETE FROM user_convent WHERE user_weixin_id = @id
AND client_id NOT IN (SELECT client.id FROM client WHERE mill=@mill);# 删除用户和染厂客户的关联
DELETE FROM sys_userprocess WHERE sys_userperm_id IN
(
SELECT id
FROM sys_userpermission WHERE openid = @openId
);
DELETE FROM sys_userpermission WHERE openid = @openId
AND mill !=@mill;$$
DELIMITER ;
# 关闭指定微信指定染厂的推送权限
# 关闭指定微信的指定染厂的推送
SET @openId = 'ovC8bsygejnm8EZASiaI6QpIdazo';
SET @mill = '华宇';
UPDATE sys_userpermission SET auth_bp=0,auth_cp=0,auth_process=0
WHERE openid=@openId AND mill=@mill;
# 本厂管理只看已排计划、日产量
# 只可以看已排计划和日产量,其他都不可以看
SET @openId = 'ovC8bs3nSRnWZ7CopDzJUMoJQi8g';
UPDATE sys_userpermission SET auth_report=1,rpt_cp=0,rpt_bp=0,rpt_metal=0,rpt_dye=0,auth_energy=0
WHERE openid=@openId;
# 更新表G_JRKBill工序名称为最后一道
# 首先制作了下面的SQL语句用于测试(也可以通过传入G_JRKBill.B_ItemID的种子值)
#============================================
# 为表 G_JRKBill 更新工序名称
DELIMITER $$
SET @lastIId = 205900;# 2020年6月30日 17:06:10执行到该主键上
drop temporary table if exists lastProcess;
CREATE TEMPORARY TABLE lastProcess(# 指定缸号的所有兄弟缸号
id INT,vatNum VARCHAR(100),serialNO INT,name VARCHAR(100)
);
# 更新打卷正式表中工序名称为缸单的最后一道工序
INSERT INTO lastProcess
SELECT d.*,p.name
FROM (
SELECT b.id,b.vatNum,max(c.serialNO) AS serialNO
FROM g_jrkbill a
LEFT JOIN plan b ON a.B_ID = b.id
LEFT JOIN craftdetail_plan c ON b.vatNum = c.vatNum
WHERE a.B_ItemID>@lastIId
GROUP BY b.id,b.vatNum
) d
LEFT JOIN craftdetail_plan e
ON d.vatNum=e.vatNum AND d.serialNO=e.serialNO
LEFT JOIN process p ON e.processId = p.sId;
# 更新工序名称
UPDATE g_jrkbill JOIN lastProcess
ON g_jrkbill.B_ID = lastProcess.id
SET B_ProcessName=lastProcess.name
where lastProcess.id is not null;
$$
DELIMITER ;
#===========================================
# 已经整合到 data_transmitter 的前端请求并且在新达测试通过,请求地址是:[http://localhost:7070/dtrans/dev/updateFinished/1234](http://localhost:7070/dtrans/dev/updateFinished/1234)
# 最后的1234是 G_JRKBill.B_ItemID,从该主键值之后的行开始更新。该服务部署在每个染厂的服务器上,所以要在染厂内部执行请求。
# 查看拥有多个染厂权限的微信号
SELECT openid,wechat_name,wechat_logname,count(*) AS dyeCount
FROM sys_userpermission
WHERE client_name='本厂'
GROUP BY openid,wechat_name,wechat_logname
HAVING count(*)>1;
# 关闭指定微信刷卡推送消息
# 关闭指定微信刷卡工序的推送消息
DELIMITER $$
SET @openId = 'ovC8bs1pQ7YMjKXj60NMy1-DQ-7o';
UPDATE sys_userpermission SET auth_process=0 WHERE openid=@openId;
$$
DELIMITER ;
# 关闭指定微信白坯、成品推送消息
# 关闭白坯、成品推送消息
DELIMITER $$
SET @openId = 'ovC8bs1pQ7YMjKXj60NMy1-DQ-7o';
UPDATE sys_userpermission SET auth_bp=0,auth_cp=0 WHERE openid=@openId;
$$
DELIMITER ;
# 给染厂客户业务设定指定染厂指定客户名下的推送权限
# 给染厂客户权限,只给推送权限,不给查看染厂报表的权限
# 两个必填参数:@mills、@clientId
DELIMITER $$
SET @openid = 'ovC8bs8rNCQnhzaN4L7_8x810lKk';
# SET @mills = '华宇印染,朗迪印染,香山印染,港荣印染,新盛针纺,新盛毛纺,白玉兰,新达纬编,昆山针织,泗水纺织';
SET @mills = '朗迪印染';
SET @clientId = 1045; # 先到表 client 查询到指定染厂下的指定名称的客户的主键值
SET @clientNickName = '';# 无需手动设置
SET @userId = 0;# 无需手动设置,下面的批处理根据 openid 自动查询赋值
# 从表 client 获取client_nickname,后面的权限表没有使用主键
SELECT client_nickname INTO @clientNickName FROM client WHERE mill=@mills AND id=@clientId;
# 使用临时表保存上面的变量 @mills 离散后形成的表数据
drop temporary table if exists tar_mills;
CREATE TEMPORARY TABLE tar_mills(# 指定缸号的所有兄弟缸号
mill VARCHAR(50)
);
INSERT INTO tar_mills
(mill)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@mills,',',help_topic_id+1),',',-1) AS mill
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(@mills)-LENGTH(REPLACE(@mills,',',''))+1;
# 1.
SELECT id INTO @userId
FROM user_weixin WHERE weixin_name=@openid;
# 2.
# 清空指定微信与染厂的映射,重新设置与上面指定的染厂的映射关系
DELETE FROM user_mill WHERE openid=@openid AND mill IN (SELECT mill FROM tar_mills);
INSERT INTO user_mill
(openid,mill)
SELECT @openid,mill
from tar_mills;
# 3.
# 清空指定微信与染厂客户的映射,然后重新构建所有染厂的所有客户映射关系
DELETE FROM user_convent
WHERE user_weixin_id = @userId
AND client_id = @clientId;
INSERT INTO user_convent
(client_id,user_weixin_id)
SELECT b.id,a.id
FROM user_weixin a
CROSS JOIN (
SELECT * FROM client WHERE mill IN (SELECT mill FROM tar_mills)
AND client.id=@clientId
) b
WHERE a.id = @userId;
# 4.
# 设置所有染厂所有客户的映射以及推送消息权限
# 先删除推送工序表中的所有关联数据,之后设置推送所有工序
DELETE FROM sys_userprocess WHERE sys_userperm_id IN
(
SELECT sys_userpermission.id
FROM sys_userpermission
WHERE openid = @openid
);
DELETE FROM sys_userpermission WHERE openid = @openid AND client_name != '本厂'
AND mill IN (SELECT mill FROM tar_mills)
AND client_name=@clientNickName
;
INSERT INTO sys_userpermission
(openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_process,
mill,wechat_logname,rpt_bp,rpt_cp,rpt_metal,rpt_dye,auth_report,auth_energy,
customer_inout,customer_inventory,customer_order,customer_progress)
SELECT @openid,b.user_name,a.client_nickname,a.client_name,1,1,1,
a.mill,b.user_logname,0,0,0,0,0,0,1,1,1,1
FROM client a
CROSS JOIN (
SELECT *
FROM user_weixin where weixin_name = @openid
) b
WHERE a.mill IN (SELECT mill FROM tar_mills)
AND a.id=@clientId;$$
DELIMITER ;
# 批量设置多染厂所有客户的推送和报表权限
# 2020年6月10日 16点39分
# 221 陈超 ovC8bs78-EymCeGDgtycJKOXGTh0
# 使用帮助:
# 下面显示的3个参数只需要设置前面两个:openid,mills
# 执行逻辑:
# 1. 根据 openid 查询获取微信用户在表 user_weixin 中的 id 以备后面使用
# 2. 微信与多个染厂的映射关系 - 先清空后添加
# 3. 微信与染厂下的客户映射关系 - 先清空后添加
# 4. 允许推送给微信用户的工序名称 - 先清空后添加
# 5. 设置企业云菜单下的报表权限
# 2020年7月20日 09:47:49 总共8个WEB ERP客户:
# 新达印染,昆山针织,华宇印染,朗迪印染,港荣印染,荣文印染,阳丰织染,泗水纺织
DELIMITER $$
SET @openid = 'ovC8bs1pQ7YMjKXj60NMy1-DQ-7o';
# SET @mills = '华宇印染,朗迪印染,香山印染,港荣印染,新盛针纺,新盛毛纺,白玉兰,新达纬编,昆山针织,泗水纺织,阳丰织染';
SET @mills = '昆山针织,华宇印染,朗迪印染,泗水纺织,阳丰织染';
SET @userId = 0;# 无需手动设置,下面的批处理根据 openid 自动查询赋值
# 使用临时表保存上面的变量 @mills 离散后形成的表数据
drop temporary table if exists tar_mills;
CREATE TEMPORARY TABLE tar_mills(# 指定缸号的所有兄弟缸号
mill VARCHAR(50)
);
INSERT INTO tar_mills
(mill)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@mills,',',help_topic_id+1),',',-1) AS mill
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(@mills)-LENGTH(REPLACE(@mills,',',''))+1;
# 1.
SELECT id INTO @userId
FROM user_weixin WHERE weixin_name=@openid;
# 2.
# 清空指定微信与染厂的映射,重新设置与上面指定的染厂的映射关系
DELETE FROM user_mill WHERE openid=@openid AND mill IN (SELECT mill FROM tar_mills);
INSERT INTO user_mill
(openid,mill)
SELECT @openid,mill
from tar_mills;
# 3.
# 清空指定微信与染厂客户的映射,然后重新构建所有染厂的所有客户映射关系
DELETE FROM user_convent
WHERE user_weixin_id = @userId
AND client_id IN (
SELECT id FROM client WHERE mill IN (SELECT mill FROM tar_mills)
);
INSERT INTO user_convent
(client_id,user_weixin_id)
SELECT b.id,a.id
FROM user_weixin a
CROSS JOIN (
SELECT * FROM client WHERE mill IN (SELECT mill FROM tar_mills)
) b
WHERE a.id = @userId;
# 4.
# 设置所有染厂所有客户的映射以及推送消息权限
# 先删除推送工序表中的所有关联数据,之后设置推送所有工序
DELETE FROM sys_userprocess WHERE sys_userperm_id IN
(
SELECT sys_userpermission.id
FROM sys_userpermission
WHERE openid = @openid
);
DELETE FROM sys_userpermission WHERE openid = @openid AND client_name != '本厂' AND mill IN (SELECT mill FROM tar_mills);
INSERT INTO sys_userpermission
(openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_process,
mill,wechat_logname,rpt_bp,rpt_cp,rpt_metal,rpt_dye,auth_report,auth_energy)
SELECT @openid,b.user_name,a.client_nickname,a.client_name,1,1,1,
a.mill,b.user_logname,0,0,0,0,0,0
FROM client a
CROSS JOIN (
SELECT *
FROM user_weixin where weixin_name = @openid
) b
WHERE a.mill IN (SELECT mill FROM tar_mills);
# 5.
# 设置所有染厂的报表权限
DELETE FROM sys_userpermission WHERE openid = @openid AND client_name = '本厂' AND mill IN (SELECT mill FROM tar_mills);
INSERT INTO sys_userpermission
(openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_process,
mill,wechat_logname,rpt_bp,rpt_cp,rpt_metal,rpt_dye,auth_report,auth_energy)
SELECT @openid,b.user_name,'0000','本厂',1,1,1,
a.mill,b.user_logname,1,1,1,1,1,1
FROM (
SELECT mill FROM tar_mills
) a
CROSS JOIN (
SELECT *
FROM user_weixin where weixin_name = @openid
) b;$$
DELIMITER ;
# 重置微信关联的所有客户
# 先要到表 user_weixin 中查询获得指定用户的主键字段的值,下面的 [@userid](#) 赋值该值
# 设置指定的微信用户接受所有客户的推送消息
set @userId = 8;
DELETE FROM user_convent WHERE user_weixin_id = @userId;
INSERT INTO user_convent
(client_id,user_weixin_id)
SELECT b.id,a.id
FROM user_weixin a
CROSS JOIN `client` b
WHERE a.id = @userId;
# 设置指定微信号指定染厂下的所有客户
# 设置指定的微信用户接受所有客户的推送消息
set @userId = 125;
SET @mills = '朗迪印染,华宇印染';
# 删除指定微信号的指定染厂下的所有客户关联
DELETE FROM user_convent
WHERE user_weixin_id = @userId
AND client_id IN (
SELECT id FROM client WHERE mill IN (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@mills,',',help_topic_id+1),',',-1) AS val
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(@mills)-LENGTH(REPLACE(@mills,',',''))+1
)
);
# 重新添加该染厂下的所有客户关联
INSERT INTO user_convent
(client_id,user_weixin_id)
SELECT b.id,a.id
FROM user_weixin a
CROSS JOIN (
SELECT * FROM client WHERE mill IN (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@mills,',',help_topic_id+1),',',-1) AS val
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(@mills)-LENGTH(REPLACE(@mills,',',''))+1
)
) b
WHERE a.id = @userId;
# 检测指定微信缺少哪些客户的映射
# 检测指定微信用户针对所有染厂所有客户没有映射关系的记录
SET @weixinId = 8; # 表 user_weixin.id
SELECT a.*
FROM client a
WHERE a.id NOT IN
(
SELECT b.client_id FROM user_convent b
WHERE b.user_weixin_id = @weixinId
)
# 给定微信用户所有推送权限
SET @openId = 'ovC8bs78-EymCeGDgtycJKOXGTh0';# 微信 openId
UPDATE sys_userpermission SET auth_bp = 1,auth_cp = 1,auth_energy = 1,auth_report = 1,auth_process = 1
WHERE openid = 'ovC8bs78-EymCeGDgtycJKOXGTh0';
# 查看指定染厂下的所有微信号的权限
# 2020年6月10日 16点46分
# 查看指定染厂下的所有人员的权限
SET @mill='港荣印染';
SELECT * FROM sys_userpermission
WHERE openid IN (
SELECT user_mill.openid FROM user_mill WHERE user_mill.mill = @mill
)
AND mill=@mill;
# 复制一个微信的权限给另外一个微信
SET @wx_auto_id_source = 8;# 源头权限微信
SET @wx_auto_id_target = 191;# 目标权限微信
SET @openId_source = '';
SET @openId_target = '';
SET @nick_name = '';
SELECT @openId_source := a.weixin_name
FROM user_weixin a
where a.id = @wx_auto_id_source;
SELECT @openId_target := a.weixin_name,@nick_name := a.user_logname
FROM user_weixin a
where a.id = @wx_auto_id_target;
# 复制染厂映射
DELETE FROM user_mill WHERE openid = @openId_target;
INSERT INTO user_mill
(openid,mill,alarm_gas)
SELECT @openId_target,mill,alarm_gas
FROM user_mill
WHERE openid = @openId_source;
# 复制客户映射表
DELETE FROM user_convent WHERE user_weixin_id = @openId_target;
INSERT INTO user_convent
(client_id, user_weixin_id)
SELECT client_id,@wx_auto_id_target
FROM user_convent
WHERE user_weixin_id = @wx_auto_id_source
# 复制权限表
DELETE FROM sys_userpermission WHERE openid = @openId_target;
INSERT INTO sys_userpermission
(openid, wechat_name, client_sid, client_name, auth_bp, auth_cp, auth_process,
process, mill, wechat_logname, rpt_bp, rpt_cp, rpt_metal, rpt_dye, auth_report,
auth_energy, customer_inventory, customer_inout, customer_progress, customer_order)
SELECT @openId_target,@nick_name,client_sid, client_name, auth_bp, auth_cp, auth_process,
process, mill, @nick_name, rpt_bp, rpt_cp, rpt_metal, rpt_dye, auth_report,
auth_energy, customer_inventory, customer_inout, customer_progress, customer_order
FROM sys_userpermission WHERE openid = @openId_source;
# 修改微信用户表的信息
UPDATE user_weixin a
JOIN (
SELECT * from user_weixin WHERE id = @wx_auto_id_source
) b
SET a.is_dev = b.is_dev,
a.status = b.status,a.check_permission=b.check_permission,
a.receive = b.receive, a.receive_process = b.receive_process,
a.receive_bp = b.receive_bp, a.receive_cp=b.receive_cp,
a.user_password = b.user_password,a.user_danwei = b.user_danwei,
a.user_sex = b.user_sex,a.tip = b.tip,a.user_img = b.user_img,a.user_phone = b.user_phone,
a.xiaochengxu_name = b.xiaochengxu_name,a.is_master = b.is_master
WHERE a.id = @wx_auto_id_target
# 设置微信拥有所有客户在客户云中的权限
# 设置微信号在客户云中拥有所有客户的权限
SET @openId = 'ovC8bsygejnm8EZASiaI6QpIdazo';
UPDATE sys_userpermission SET customer_inout=1,customer_inventory=1,
customer_order=1,customer_progress=1
WHERE openid = @openId;
# 删除指定微信的所有数据
调用存储过程 `call usp_deleteWechatUser('ovC8bsxlfzNSkSyGVkpkpbJjBtOI');` 其逻辑如下面:
# 删除微信用户的所有数据,只要设置 openId
DELIMITER $$
START TRANSACTION ;
SET @openId = 'ovC8bs768e0iJI4Kq6AMN_VS92Gs';# 微信用户的 openid
SET @id = 0;# 表 user_weixin 中的自增主键
set @id = (select id from user_weixin where weixin_name=@openId);
DELETE FROM scan_scene WHERE openid = @openId;# 删除场景值
DELETE FROM user_mill WHERE openid = @openId;# 删除用户和染厂的关联
DELETE FROM user_convent WHERE user_weixin_id = @id;# 删除用户和染厂客户的关联
DELETE FROM user_weixin WHERE id = @id;# 删除微信用户
DELETE FROM sys_userprocess WHERE sys_userperm_id IN
(
SELECT id
FROM sys_userpermission WHERE openid = @openId
);
DELETE FROM sys_userpermission WHERE openid = @openId;
COMMIT ;
$$
DELIMITER ;
# 制作测试数据 - 复制发货单为测试数据
# 2019年10月30日14:22:39
# chanchaw
# 使用方法:
# 设定指定条件:表 sendout_main 的主键,测试用的客户编号(隶属 新东方智能化的4巨头)
# 一次只生成一个发货单的复制品,用来发送给开发人员进行测试
SET @id = 436;# 被复制的表 sendout_main 的主键
# 用于测试的客户编号,表 client 的主键,查询 mill = '新东方智能化' 的所有测试用客户
# 564 - 华为 - xdfhw
# 565 - 阿里 - xdfal
# 566 - 腾讯 - xdftx
# 567 - 百度 - xdfbd
SET @clientId = 564;
SET @mill = '新东方智能化';# 固定 - 硬编码
# 根据编号获取客户名称
SELECT @clientName:=a.client_name
FROM client a
WHERE a.id = @clientId;
# 获取即将被复制的单据的单据编号
SELECT @billCode:=a.bill_code,@clientIdOld := a.client_id
FROM sendout_main a
WHERE a.id = @id;
# 插入主表数据
INSERT INTO sendout_main
(is_send,client_id,client,client_material,mill,order_no,list_date,finish_date,craft,
progress,color,color_no,bill_code,is_audit,create_date,inv_pairs,inv_kilo,invalid)
SELECT 0,@clientId,client,@clientName,@mill,order_no,list_date,finish_date,craft,
progress,color,color_no,bill_code,is_audit,create_date,inv_pairs,inv_kilo,invalid
FROM sendout_main
WHERE id = @id;
# 插入明细表数据
INSERT INTO sendout_dtl
(bill_code,client_id,bill_type,vat_no,orderno,specification,product_name,colorno,pairs,
kilo,meter,client_process,color,is_audit,inv_pairs,inv_kilo)
SELECT bill_code,@clientId,bill_type,vat_no,orderno,specification,product_name,colorno,pairs,
kilo,meter,client_process,color,is_audit,inv_pairs,inv_kilo
FROM sendout_dtl
WHERE bill_code = @billCode
AND client_id = @clientIdOld;
#
# 制作测试数据 - 复制白坯入库单为测试数据
# 复制指定的白坯入库数据为测试用数据
SET @id = 198;
SET @mill = '新东方智能化';
SET @clientSid = 'xdfhw';
SET @clientName = '华为';
SET @clientId = 564;
SELECT @billCode:= a.bill_code
FROM bp_pushlist_main a WHERE a.id = @id;
# 写入主表数据
INSERT INTO bp_pushlist_main
(bill_type,bill_code,client,client_material,client_id,is_send,orderno,product,
specification,pairs,kilo,working_company,bill_date,pairsno,create_date,inv_pairs,inv_kilo,invalid)
SELECT bill_type,bill_code,@mill,client_material,client_id,0,orderno,product,
specification,pairs,kilo,working_company,bill_date,pairsno,create_date,inv_pairs,inv_kilo,invalid
FROM bp_pushlist_main a
WHERE a.id = @id;
# 写入明细表数据
INSERT INTO bp_pushlist_dtl
(bill_code,bill_type,client_sid,client_name,mill,orderno,product,specification,
working_company,pairs,kilo,pairsno,inv_pairs,inv_kilo)
SELECT bill_code,bill_type,@clientSid,@clientName,@mill,orderno,product,specification,
working_company,pairs,kilo,pairsno,inv_pairs,inv_kilo
FROM bp_pushlist_dtl a
WHERE bill_code = @billCode
#
# 制作测试数据 - 复制刷卡工序
SET @id = 1096;
SET @mill = '新东方智能化';
SET @clientId = 564;
SET @clientSid = 'xdfhw';
SET @clientName = '华为';
INSERT INTO client_pushlist
(client_id,client,product,specification,color,color_no,status,vat_count,progress,vat_num,
finish_date,create_date,craft,order_no,mill,bill_type,bill_code,pairs,kilo,meter,color_cloth_name)
SELECT
@clientSid,@clientName,product,specification,color,color_no,0,vat_count,progress,vat_num,
finish_date,create_date,craft,order_no,@mill,bill_type,bill_code,pairs,kilo,meter,color_cloth_name
FROM client_pushlist a
WHERE a.id = @id;
#
# 删除指定时间之前的刷卡记录
DELETE FROM client_pushlist WHERE date_format(create_date,"%Y-%m-%d")<"2019-11-01";
DELETE FROM client_pushlist_Detail WHERE date_format(create_date,"%Y-%m-%d")<"2019-11-01";
#
# 设置指定微信号接受所有报警消息
UPDATE user_mill SET alarm_gas = 1 WHERE openid = 'ovC8bs78-EymCeGDgtycJKOXGTh0';
#
# 重置某微信指定染厂下的所有已关联的客户的所有权限
# 重置某微信指定染厂的所有权限
SET @openid='ovC8bs78-EymCeGDgtycJKOXGTh0';
SET @mill='港荣印染';
DELETE FROM sys_userpermission WHERE mill = @mill
AND openid=@openid;
INSERT INTO sys_userpermission
(openid,wechat_name,client_sid,client_name,auth_bp,auth_cp,auth_report,auth_energy,auth_process,mill,wechat_logname)
SELECT a.weixin_name,a.user_name,c.client_nickname,client_name,1,1,1,1,1,@mill,a.user_name
FROM user_weixin a
LEFT JOIN user_convent b
ON a.id = b.user_weixin_id
LEFT JOIN client c
ON b.client_id=c.id
WHERE a.weixin_name=@openid
AND c.mill=@mill;
# 清空后台日志文件内容
cat /dev/null > /projs/wxpadLogs/event.log
cat /dev/null > /projs/wxpadLogs/manager.log
cat /dev/null > /projs/wxpadLogs/push.log
cat /dev/null > /projs/wxpadLogs/scan.log
cat /dev/null > /projs/wxpadLogs/wxpad.log
# 有发货主表数据,没有明细数据
# 检测问题数据:有发货主表数据没有对应的明细数据,会导致推送发货数据失败
# 查询获取所有该非法数据
SELECT a.id,b.id
FROM sendout_main a
LEFT JOIN sendout_dtl b ON a.bill_code = b.bill_code AND a.client_id = b.client_id
WHERE a.is_send=0
AND b.id IS NULL
ORDER BY a.id,b.id;
# 删除此类非法数据
DELIMITER $$
CREATE TEMPORARY TABLE tmp(id INT);
INSERT INTO tmp
SELECT a.id
FROM sendout_main a
LEFT JOIN sendout_dtl b ON a.bill_code = b.bill_code AND a.client_id = b.client_id
WHERE a.is_send=0
AND b.id IS NULL
ORDER BY a.id,b.id;
DELETE FROM sendout_main WHERE id IN (
SELECT id FROM tmp
);
$$
# 检测权限表中重复数据
查询获取所有符合条件的重复数据:微信号、染厂、客户编号
有这种情况的微信收不到成品发货的推送消息
select id,count(id) as duplicateCount
from sys_userpermission
where client_name <>'本厂'
GROUP BY openid,client_sid,mill
HAVING count(*)>1
ORDER BY id;
# 为用户设置能源监控的权限
# 设置指定微信OPENID能源监控权限
# 设置下面3个参数即可
# SELECT * FROM user_weixin;
SET @openId='ovC8bs78-EymCeGDgtycJKOXGTh0';
SET @mill='白玉兰';
SET @name='陈超';
DELETE FROM user_mill WHERE openid=@openId AND mill=@mill;
INSERT INTO user_mill(openid,mill) VALUES (@openId,@mill);
DELETE FROM sys_userpermission WHERE openid=@openId AND client_name='本厂' AND mill=@mill;
INSERT INTO sys_userpermission (openid, wechat_name, client_sid, client_name, auth_bp, auth_cp, auth_process, process, mill, wechat_logname, rpt_bp, rpt_cp, rpt_metal, rpt_dye, auth_report, auth_energy, customer_inventory, customer_inout, customer_progress, customer_order) VALUES
(@openId,@name,1,'本厂',1,1,1,'无',@mill,@name,1,1,1,1,1,1,1,1,1,1);
# 更新表 user_mill 的昵称、真实姓名
# 2020年5月20日10:56:56
# 依据微信用户表 user_weixin 的昵称、真实姓名
# 更新用户工厂映射表 user_mill 的昵称、姓名字段
update user_mill a
LEFT JOIN user_weixin b
ON a.openid = b.weixin_name
SET a.nick_name = b.user_logname,
a.real_name = b.user_name
WHERE 1=1;
# 删除没有对应明细的发货主表数据
# 删除没有对应明细数据的主表数据
DELIMITER $$
drop temporary table if exists tmpTable;
CREATE TEMPORARY TABLE tmpTable(# 指定缸号的所有兄弟缸号
pvalue INT
);
INSERT INTO tmpTable
SELECT a.id
FROM sendout_main a
LEFT JOIN (
SELECT bill_code,client_id,count(*) AS rowCount FROM sendout_dtl GROUP BY bill_code,client_id
) b
ON a.bill_code=b.bill_code
AND a.client_id=b.client_id
WHERE b.rowCount IS NULL OR b.rowCount=0;
DELETE FROM sendout_main WHERE id IN (SELECT pvalue FROM tmpTable);
$$
DELIMITER ;
# 查询获取指定微信的客户权限
# 2021年4月20日 15:51:14
# 根据微信用户主键查询获取拥有的客户权限
select a.id,a.client_id,a.user_weixin_id,
b.client_name,b.client_nickname,
c.user_logname,c.user_name
from user_convent a
LEFT JOIN client b ON a.client_id = b.id
LEFT JOIN user_weixin c ON a.user_weixin_id = c.id
where 1=1
AND a.user_weixin_id=375;
# 根据 openid 查询获取拥有的客户权限
select a.id,a.client_id,a.user_weixin_id,
b.client_name,b.client_nickname,
c.user_logname,c.user_name
from user_convent a
LEFT JOIN client b ON a.client_id = b.id
LEFT JOIN user_weixin c ON a.user_weixin_id = c.id
where 1=1
AND c.weixin_name='ovC8bs2HZ5dWOiVNvW0VxR5raLSQ';
后台服务
概述
微信服务号后台服务项目仓库 https://gitee.com/chanchaw/wxpad.git
API
get 方式检测心跳日志 https://www.xdfznh.club/wxpadbe/heartbeat/check
审核为企业云权限请求的API /user/enterprisecloud,最终调用了存储过程 usp_setEnterpriseCloud
审核为客户云权限请求的API /user/clientcloud ,最终调用了存储过程 usp_setClientCloud
关注逻辑
- 微信扫描基础资料中的“往来单位”中指定客户的二维码
- 点击关注后,我方后台服务推送模板消息给微信用户,详情 url 是
https://www.xdfznh.club/wxpadfe/raw/new_user_real_name.html。其页面在服务器中的路径是/projfe/wxpadfe/raw/new_user_real_name.html - 用户填写真实姓名后提交按钮请求的 API 是
/wxpadbe/wx/register - 用户提交请求后台发送给管理员模板消息的详情页 URL 是
https://www.xdfznh.club/wxpadfe/raw/admin_audit.html,前端页面的绝对路径是/projfe/wxpadfe/raw/admin_audite.html - 审核新用户的页面两个按钮分别请求:
/user/setClientCloud和/user/setEnterpriseCloud,两个API分别调用存储过程:usp_setClientCloud和usp_setEnterpriseCloud。
前端项目
概述
在染厂云服务器的路径是 /projfe/wxpadfe,源码仓库是 https://gitee.com/chanchaw/wxpadfe/tree/master 是 Angular 项目,后来长时间没有跟进官方升级版本,2024年2月17日打算追加前端页面就干脆使用原生前端开发。2024年2月17日 16:11:19 为心跳报警的模板消息制作跳转页面用于清除心跳日志时使用了前端原生做在了 Angular 项目中,路径是 src\app\raw
开发手册
客户云 > 染厂已排计划
# 前端页面
ClientPlan.html
# 请求微信后台服务动态查询sql的接口
/execute/query/
# 最终调用的存储过程:
ClientPlanDetail
