fanzherong_v hai 1 mes
pai
achega
e0faa6290a
Modificáronse 25 ficheiros con 1206 adicións e 24 borrados
  1. 21 16
      snowy-admin-web/src/views/biz/bizorder/form.vue
  2. 6 0
      snowy-common/src/main/java/vip/xiaonuo/common/prop/CommonProperties.java
  3. 4 0
      snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseLoginUser.java
  4. 52 3
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/controller/ApiController.java
  5. 39 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WechatTemplateMsg.java
  6. 116 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WeiXinRes.java
  7. 23 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WxUserMsgParam.java
  8. 16 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WxUserParam.java
  9. 126 3
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/service/ApiService.java
  10. 64 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/service/impl/BizAppointmentRecordServiceImpl.java
  11. 123 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/controller/OaWxSendLogController.java
  12. 51 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/entity/OaWxSendLog.java
  13. 34 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/enums/OaWxSendLogEnum.java
  14. 25 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/mapper/OaWxSendLogMapper.java
  15. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/mapper/mapping/OaWxSendLogMapper.xml
  16. 44 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogAddParam.java
  17. 48 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogEditParam.java
  18. 33 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogIdParam.java
  19. 45 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogPageParam.java
  20. 80 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/service/OaWxSendLogService.java
  21. 94 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/service/impl/OaWxSendLogServiceImpl.java
  22. 4 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java
  23. 141 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/HttpClientUtil.java
  24. 4 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java
  25. 8 2
      snowy-web-app/src/main/resources/application-local.properties

+ 21 - 16
snowy-admin-web/src/views/biz/bizorder/form.vue

@@ -114,13 +114,15 @@
 		}
 
 		if(formData.value.saleOrderInfo){
-			//根据货品名称和重量查询提货时间段
-			goodsConfApi.getList({goodsName:formData.value.saleOrderInfo.split('-')[2],needWeight:formData.value.saleOrderInfo.split('-')[3]}).then((res)=>{
-				deliveryTimeIdList.value = res.map((item)=>{
-					return{
-						value:item.id,
-						label:item.confStartTime+'~'+item.confEndTime
-					}
+			bizSaleOrderApi.detailById({id:formData.value.saleOrderInfo}).then((res)=>{
+				//根据货品名称和重量查询提货时间段
+				goodsConfApi.getList({goodsName:res.saleGoodsName,needWeight:res.saleOrderWeight}).then((res)=>{
+					deliveryTimeIdList.value = res.map((item)=>{
+						return{
+							value:item.id,
+							label:item.confStartTime+'~'+item.confEndTime
+						}
+					})
 				})
 			})
 		}
@@ -148,17 +150,20 @@
 			formData.value.goodsName = res.saleGoodsName
 			formData.value.orderWeight = res.saleOrderWeight
 			formData.value.orderType = res.saleOrderType
-		})
-		formData.value.deliveryTimeId = ''
-		//根据货品名称和重量查询提货时间段
-		goodsConfApi.getList({goodsName:value.split('-')[2],needWeight:value.split('-')[3]}).then((res)=>{
-			deliveryTimeIdList.value = res.map((item)=>{
-				return{
-					value:item.id,
-					label:item.confStartTime+'~'+item.confEndTime
-				}
+			formData.value.deliveryTimeId = ''
+			//根据货品名称和重量查询提货时间段
+			console.log("goodsName:"+formData.value.goodsName)
+			console.log("needWeight:"+formData.value.orderWeight)
+			goodsConfApi.getList({goodsName:formData.value.goodsName,needWeight:formData.value.orderWeight}).then((res)=>{
+				deliveryTimeIdList.value = res.map((item)=>{
+					return{
+						value:item.id,
+						label:item.confStartTime+'~'+item.confEndTime
+					}
+				})
 			})
 		})
+
 	}
 
 	// 关闭抽屉

+ 6 - 0
snowy-common/src/main/java/vip/xiaonuo/common/prop/CommonProperties.java

@@ -47,6 +47,12 @@ public class CommonProperties {
     private String officialAppId;
     private String officialAeskey;
     private String officialSecret;
+    private String officialTemplete;
+
+    /**小程序*/
+    private String programAppId;
+
+    private String programSecret;
 
 
 }

+ 4 - 0
snowy-plugin-api/snowy-plugin-auth-api/src/main/java/vip/xiaonuo/auth/core/pojo/SaBaseLoginUser.java

@@ -250,6 +250,10 @@ public abstract class SaBaseLoginUser {
     /**客户id*/
     private String customerId;
 
+    private String openId;
+
+    private String unionId;
+
     /** 是否可登录,由继承类实现 */
     public abstract Boolean getEnabled();
 

+ 52 - 3
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/controller/ApiController.java

@@ -1,23 +1,34 @@
 package vip.xiaonuo.biz.modular.api.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.asn1.ocsp.ResponseData;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
+import vip.xiaonuo.biz.modular.api.param.WeiXinRes;
+import vip.xiaonuo.biz.modular.api.param.WxUserParam;
 import vip.xiaonuo.biz.modular.api.service.ApiService;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
+import vip.xiaonuo.biz.modular.user.service.BizUserService;
 import vip.xiaonuo.biz.modular.utils.SignUtil;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.common.prop.CommonProperties;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
 
 @Tag(name = "微信公众号")
 @RestController
 @Validated
+@Slf4j
 public class ApiController {
 
     @Resource
@@ -26,6 +37,9 @@ public class ApiController {
     @Resource
     private ApiService apiService;
 
+    @Resource
+    private BizUserService bizUserService;
+
     /***
      * 微信公众号验证接口
      * @param request
@@ -68,4 +82,39 @@ public class ApiController {
     public void officialCallback(HttpServletRequest request, HttpServletResponse response) {
         apiService.officialCallback(request, response);
     }
+
+
+    /**
+     * 微信小程序 _绑定公众号操作
+     *
+     * @param
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/wx/bindingWX")
+    public CommonResult<String> bindingWX(@RequestBody WxUserParam wxUserParam) {
+        log.info("==========用户ID:" + wxUserParam.getId() + "==========");
+        log.info("==========微信js_Code:" + wxUserParam.getJs_code() + "==========");
+
+        BizUser user = bizUserService.queryEntity(wxUserParam.getId());
+
+        //Js_code 去交换 openId
+        String js_code = wxUserParam.getJs_code();
+        Map<String, Object> param = new HashMap<>(1);
+        param.put("js_code", js_code);
+        String res = apiService.weiXinSend(param);
+        log.info("==========微信绑定接口返回:" + res + "==========");
+        //解析微信返回内容
+        WeiXinRes weiXinRes = new WeiXinRes().weixinResgistRes(res);
+        if (!weiXinRes.getErrcode().equals(0)) {
+            throw new CommonException(weiXinRes.getErrcode(), weiXinRes.getErrmsg());
+        }
+        log.info("==========微信绑定接口返回OpenId:" + weiXinRes.getOpenid() + "==========");
+        log.info("==========微信绑定接口返回UnionId:" + weiXinRes.getUnionid() + "==========");
+        user.setOpenId(weiXinRes.getOpenid());
+        user.setUnionId(weiXinRes.getUnionid());
+        bizUserService.updateById(user);
+        return CommonResult.ok();
+    }
+
 }

+ 39 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WechatTemplateMsg.java

@@ -0,0 +1,39 @@
+package vip.xiaonuo.biz.modular.api.param;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.TreeMap;
+
+@Data
+public class WechatTemplateMsg {
+
+    private String touser; //接收者openid
+
+    private String template_id; //模板ID
+
+    private String page; //模板跳转链接
+
+    private String miniprogram_state;
+    // 跳小程序所需数据
+    private HashMap<String, String> miniprogram;
+
+    private TreeMap<String, TreeMap<String, String>> data; //data数据
+
+    /**
+     * 参数
+     *
+     * @param value
+     * @return
+     */
+    public static TreeMap<String, String> item(String value) {
+        TreeMap<String, String> params = new TreeMap<String, String>();
+        params.put("value", value);
+        return params;
+    }
+
+    private String appidReq;
+
+    private String secretReq;
+
+}

+ 116 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WeiXinRes.java

@@ -0,0 +1,116 @@
+package vip.xiaonuo.biz.modular.api.param;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Title: WeiXinRes
+ * @Package cn.stylefeng.guns.sys.modular.member.entity
+ * @Description: (微信获取openid返回结果)
+ * @Author: zhangfuqiang
+ * @Date: 2020/5/18 17:20
+ * @Version V1.0
+ */
+public class WeiXinRes {
+
+    private Integer errcode;
+    private String errmsg;
+    private String openid;
+    private String session_key;
+    private String unionid;
+
+
+    Map<String, Object> param = new HashMap<>();
+
+    public WeiXinRes() {
+        param.put("-1", "系统繁忙,请稍候再试");
+        param.put("0", "请求成功");
+        param.put("40029", "code 无效");
+        param.put("45011", "频率限制,每个用户每分钟100次");
+    }
+
+    /**
+     * 结果转换
+     *
+     * @param res
+     */
+    public WeiXinRes weixinResgistRes(String res) {
+        JSONObject result = JSONObject.parseObject(res);
+        WeiXinRes weiXinRes = new WeiXinRes();
+        if (ObjectUtil.isNotEmpty(result.get("openid"))) {
+            weiXinRes.setOpenid(result.get("openid").toString());
+            weiXinRes.setSession_key(result.get("session_key").toString());
+            weiXinRes.setErrcode(0);
+            if (ObjectUtil.isNotEmpty(result.get("unionid"))) {
+                weiXinRes.setUnionid(result.get("unionid").toString());
+            }
+        } else if (ObjectUtil.isNotEmpty(result.get("errcode"))) {
+            weiXinRes.setErrcode(Integer.parseInt(result.get("errcode").toString()));
+            weiXinRes.setErrmsg(result.get("errmsg").toString());
+        }
+        return weiXinRes;
+    }
+
+    public void setErrcode(Integer errcode) {
+        this.errcode = errcode;
+    }
+
+    public void setErrmsg(String errmsg) {
+        this.errmsg = errmsg;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public void setSession_key(String session_key) {
+        this.session_key = session_key;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+
+    public void setParam(Map<String, Object> param) {
+        this.param = param;
+    }
+
+    public Integer getErrcode() {
+        return errcode;
+    }
+
+    public String getErrmsg() {
+        return errmsg;
+    }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public String getSession_key() {
+        return session_key;
+    }
+
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public Map<String, Object> getParam() {
+        return param;
+    }
+
+    @Override
+    public String toString() {
+        return "WeiXinRes{" +
+                "errcode='" + errcode + '\'' +
+                ", errmsg='" + errmsg + '\'' +
+                ", openid='" + openid + '\'' +
+                ", session_key='" + session_key + '\'' +
+                ", unionid='" + unionid + '\'' +
+                ", param=" + param +
+                '}';
+    }
+}

+ 23 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WxUserMsgParam.java

@@ -0,0 +1,23 @@
+package vip.xiaonuo.biz.modular.api.param;
+
+import lombok.Data;
+
+@Data
+public class WxUserMsgParam {
+    /**模板id*/
+    private String templateId;
+    /**openId*/
+    private String openId;
+    /**模板参数1*/
+    private String param1;
+    /**模板参数1对应值*/
+    private String paramData1;
+    /**模板参数2*/
+    private String param2;
+    /**模板参数2对应值*/
+    private String paramData2;
+    /**模板参数3*/
+    private String param3;
+    /**模板参数3对应值*/
+    private String paramData3;
+}

+ 16 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/param/WxUserParam.java

@@ -0,0 +1,16 @@
+package vip.xiaonuo.biz.modular.api.param;
+
+import lombok.Data;
+
+@Data
+public class WxUserParam {
+
+    private String js_code;
+
+
+    /*
+     * 账号的主键ID
+     *
+     * */
+    private String id;
+}

+ 126 - 3
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/service/ApiService.java

@@ -10,16 +10,26 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import vip.xiaonuo.biz.modular.api.param.WechatTemplateMsg;
+import vip.xiaonuo.biz.modular.api.param.WxUserMsgParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.entity.OaWxSendLog;
+import vip.xiaonuo.biz.modular.oawxsendlog.service.OaWxSendLogService;
 import vip.xiaonuo.biz.modular.officialinfo.entity.OfficialInfo;
 import vip.xiaonuo.biz.modular.officialinfo.service.OfficialInfoService;
+import vip.xiaonuo.biz.modular.utils.HttpClientUtil;
 import vip.xiaonuo.biz.modular.utils.MsgUtil;
 import vip.xiaonuo.biz.modular.utils.XmlUtil;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.prop.CommonProperties;
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
 import java.io.PrintWriter;
-import java.util.Date;
-import java.util.Map;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.util.*;
 
 @Slf4j
 @Service
@@ -30,6 +40,8 @@ public class ApiService {
 
     @Resource
     private CommonProperties commonProperties;
+    @Resource
+    private OaWxSendLogService oaWxSendLogService;
 
     public static JSONObject wx_token_map = new JSONObject();
 
@@ -108,7 +120,7 @@ public class ApiService {
 
     /**
      * 微信公众号的appid以及sercet
-     *
+     * 获取微信用户信息
      * @param openId
      * @return
      */
@@ -164,4 +176,115 @@ public class ApiService {
         }
         return token;
     }
+
+    public String weiXinSend(Map<String, Object> param) {
+        String newParam = transferParam(param);
+        return sendGet("https://api.weixin.qq.com/sns/jscode2session", newParam);
+    }
+
+    public String transferParam(Map<String, Object> param) {
+        if (param.size() < 0) {
+            return null;
+        }
+        String resultPam = "appid=" + commonProperties.getProgramAppId() + "&secret=" + commonProperties.getProgramSecret() + "&grant_type=" + "authorization_code";
+        System.out.println(resultPam);
+        for (Map.Entry<String, Object> vo : param.entrySet()) {
+            resultPam += "&" + vo.getKey() + "=" + vo.getValue();
+        }
+        return resultPam;
+    }
+
+
+    public String sendGet(String url, String param) {
+        log.info("======绑定微信接口url:" + url + "=======");
+        log.info("======绑定微信接口入参:" + param + "=======");
+        String result = "";
+        BufferedReader in = null;
+        try {
+            String urlNameString = url + "?" + param;
+            log.info("=======绑定微信接口地址:" + urlNameString + "========");
+            URL realUrl = new URL(urlNameString);
+            // 打开和URL之间的连接
+            URLConnection connection = realUrl.openConnection();
+            // 设置通用的请求属性
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 建立实际的连接
+            connection.connect();
+            // 获取所有响应头字段
+            Map<String, List<String>> map = connection.getHeaderFields();
+            // 定义 BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(
+                    connection.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输入流
+        finally {
+            try {
+                if (in != null)
+                    in.close();
+            } catch (Exception e2) {
+                e2.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * @param
+     * @param
+     * @return
+     */
+    public void sendProjectExpireMsg(OaWxSendLog wxSendLog, WxUserMsgParam wxUserMsgParam) {
+        WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg();
+        wechatTemplateMsg.setTemplate_id(wxUserMsgParam.getTemplateId());
+        wechatTemplateMsg.setTouser(wxUserMsgParam.getOpenId());
+        HashMap<String, String> miniprogram = new HashMap<>();
+        miniprogram.put("appid", commonProperties.getProgramAppId());
+        //miniprogram.put("pagepath", "pages/appointment/list");
+        wechatTemplateMsg.setMiniprogram(miniprogram);
+
+        TreeMap<String, TreeMap<String, String>> params = new TreeMap<>();
+        //根据具体模板参数组装
+        if(ObjectUtil.isNotEmpty(wxUserMsgParam.getParam1())){
+            params.put(wxUserMsgParam.getParam1(), WechatTemplateMsg.item(wxUserMsgParam.getParamData1()));
+        }
+        if(ObjectUtil.isNotEmpty(wxUserMsgParam.getParam2())){
+            params.put(wxUserMsgParam.getParam2(), WechatTemplateMsg.item(wxUserMsgParam.getParamData2()));
+        }
+        if(ObjectUtil.isNotEmpty(wxUserMsgParam.getParam3())){
+            params.put(wxUserMsgParam.getParam3(), WechatTemplateMsg.item(wxUserMsgParam.getParamData3()));
+        }
+        wechatTemplateMsg.setData(params);
+        log.info("==========公众号appId:"+commonProperties.getOfficialAppId()+"==========");
+        wechatTemplateMsg.setAppidReq(commonProperties.getOfficialAppId());
+        log.info("==========公众号密钥:"+commonProperties.getOfficialSecret()+"==========");
+        wechatTemplateMsg.setSecretReq(commonProperties.getOfficialSecret());
+
+        log.info(JSONObject.toJSONString(wechatTemplateMsg));
+
+        StringBuffer url = new StringBuffer("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=");
+        try {
+            url.append(URLEncoder.encode(getAccessToken(
+                    wechatTemplateMsg.getAppidReq(), wechatTemplateMsg.getSecretReq()), "UTF-8"));
+            log.info("==========公众号发送通知url:"+url+"==========");
+            String result = HttpClientUtil.doPostJson(url.toString(), JSONObject.toJSONString(wechatTemplateMsg));
+            log.info("==========send WxMsg :{}", JSONObject.toJSONString(result));
+            if (ObjectUtil.isNotNull(wxSendLog)) {
+                wxSendLog.setSendMsg(JSONObject.toJSONString(wechatTemplateMsg));
+                wxSendLog.setBackMsg(JSONObject.toJSONString(result));
+                oaWxSendLogService.save(wxSendLog);
+            }
+        } catch (UnsupportedEncodingException e) {
+            log.info("----模板消息发送失败-----");
+            e.printStackTrace();
+        }
+    }
 }

+ 64 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizappointmentrecord/service/impl/BizAppointmentRecordServiceImpl.java

@@ -26,12 +26,15 @@ import com.fhs.trans.service.impl.TransService;
 import com.google.common.collect.Maps;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.biz.modular.api.param.WxUserMsgParam;
+import vip.xiaonuo.biz.modular.api.service.ApiService;
 import vip.xiaonuo.biz.modular.bizappointmentrecord.param.*;
 import vip.xiaonuo.biz.modular.bizappointmenttime.entity.BizAppointmentTime;
 import vip.xiaonuo.biz.modular.bizappointmenttime.service.BizAppointmentTimeService;
@@ -48,8 +51,13 @@ import vip.xiaonuo.biz.modular.goods.entity.BizGoods;
 import vip.xiaonuo.biz.modular.goods.service.BizGoodsService;
 import vip.xiaonuo.biz.modular.goodsConf.entity.BizGoodsConf;
 import vip.xiaonuo.biz.modular.goodsConf.service.BizGoodsConfService;
+import vip.xiaonuo.biz.modular.oawxsendlog.entity.OaWxSendLog;
+import vip.xiaonuo.biz.modular.officialinfo.entity.OfficialInfo;
+import vip.xiaonuo.biz.modular.officialinfo.service.OfficialInfoService;
 import vip.xiaonuo.biz.modular.record.entity.BizRecord;
 import vip.xiaonuo.biz.modular.record.service.BizRecordService;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
+import vip.xiaonuo.biz.modular.user.service.BizUserService;
 import vip.xiaonuo.biz.modular.utils.CommonExportUtil;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
@@ -57,8 +65,10 @@ import vip.xiaonuo.common.page.CommonPageRequest;
 import vip.xiaonuo.biz.modular.bizappointmentrecord.entity.BizAppointmentRecord;
 import vip.xiaonuo.biz.modular.bizappointmentrecord.mapper.BizAppointmentRecordMapper;
 import vip.xiaonuo.biz.modular.bizappointmentrecord.service.BizAppointmentRecordService;
+import vip.xiaonuo.common.prop.CommonProperties;
 
 import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -71,6 +81,7 @@ import java.util.regex.Pattern;
  * @author fanzherong
  * @date  2025/03/24 14:47
  **/
+@Slf4j
 @Service
 public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentRecordMapper, BizAppointmentRecord> implements BizAppointmentRecordService {
 
@@ -93,6 +104,14 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
     private BizGoodsConfService bizGoodsConfService;
     @Resource
     private BizOrderConfigService bizOrderConfigService;
+    @Resource
+    private BizUserService bizUserService;
+    @Resource
+    private OfficialInfoService officialInfoService;
+    @Resource
+    private CommonProperties commonProperties;
+    @Resource
+    private ApiService apiService;
 
     @Override
     public Page<BizAppointmentRecord> page(BizAppointmentRecordPageParam bizAppointmentRecordPageParam) {
@@ -172,6 +191,10 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
             bizAppointmentTime.setApplyNumberAlready(bizAppointmentTime.getApplyNumberAlready()+1);
             bizOrderConfigService.updateById(bizAppointmentTime);
         }
+
+        if(StringUtils.equals(bizAppointmentRecord.getStatus(),"3")){
+            sendAccount(bizAppointmentRecord,null);
+        }
     }
 
     public void saveRecord(BizAppointmentRecord bizAppointmentRecord){
@@ -390,6 +413,10 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
             }
             bizAppointmentRecord.setAppointmentReason(bizAppointmentRecordEditParam.getAppointmentReason());
             this.updateById(bizAppointmentRecord);
+
+            if(StringUtils.equals(bizAppointmentRecord.getStatus(),"3")){
+                sendAccount(bizAppointmentRecord,null);
+            }
         }
     }
 
@@ -609,4 +636,41 @@ public class BizAppointmentRecordServiceImpl extends ServiceImpl<BizAppointmentR
         String carNumberPattern = "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼]{1}(([A-HJ-Z]{1}[A-HJ-NP-Z0-9]{5})|([A-HJ-Z]{1}(([DF]{1}[A-HJ-NP-Z0-9]{1}[0-9]{4})|([0-9]{5}[DF]{1})))|([A-HJ-Z]{1}[A-D0-9]{1}[0-9]{3}警)))|([0-9]{6}使)|((([沪粤川云桂鄂陕蒙藏黑辽渝]{1}A)|鲁B|闽D|蒙E|蒙H)[0-9]{4}领)|(WJ[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼·•]{1}[0-9]{4}[TDSHBXJ0-9]{1})|([VKHBSLJNGCE]{1}[A-DJ-PR-TVY]{1}[0-9]{5})";
         return Pattern.matches(carNumberPattern, carNumber);
     }
+
+
+    /** 发送微信公众号推送消息*/
+    public void sendAccount(BizAppointmentRecord bizAppointmentRecord,String accountSwitch){
+        BizUser bizUser = bizUserService.queryEntity(bizAppointmentRecord.getCreateUser());
+        if(ObjectUtil.isNotEmpty(bizUser.getUnionId())){
+            log.info("当前用户:"+bizUser.getName()+"存在unionId");
+            //根据unionId查询微信公众号openId
+            OfficialInfo officialInfo = officialInfoService.getOne(new QueryWrapper<OfficialInfo>().lambda().
+                    eq(OfficialInfo::getUnionId, bizUser.getUnionId()).
+                    eq(OfficialInfo::getStatus, "1").last("limit 1"));
+
+            if(ObjectUtil.isNotNull(officialInfo)){
+                log.info("当前用户:"+bizUser.getName()+"存在openId");
+                OaWxSendLog oaWxSendLog = new OaWxSendLog();
+                oaWxSendLog.setSendUserId(bizUser.getId());
+                oaWxSendLog.setSendUserName(bizUser.getName());
+                WxUserMsgParam wxUserMsgParam = new WxUserMsgParam();
+                wxUserMsgParam.setTemplateId(commonProperties.getOfficialTemplete());
+                wxUserMsgParam.setOpenId(officialInfo.getOfficialOpenId());
+                wxUserMsgParam.setParam1("car_number9");
+                wxUserMsgParam.setParamData1(bizAppointmentRecord.getLicenseNumber());
+                wxUserMsgParam.setParam2("time6");
+                String time = null;
+                BizGoodsConf bizGoodsConf = bizGoodsConfService.getById(bizAppointmentRecord.getTimeId());
+                if(ObjectUtil.isNotNull(bizGoodsConf)){
+                    time = DateUtil.format(bizGoodsConf.getConfStartTime(),"yyyy-MM-dd HH:mm:ss")+"~"+DateUtil.format(bizGoodsConf.getConfEndTime(),"yyyy-MM-dd HH:mm:ss");
+                }
+                wxUserMsgParam.setParamData2(time);
+                wxUserMsgParam.setParam3("thing2");
+                wxUserMsgParam.setParamData3(bizAppointmentRecord.getQueueNumber().toString());
+                apiService.sendProjectExpireMsg(oaWxSendLog,wxUserMsgParam);
+            }else{
+                log.info("为查询到用户"+bizUser.getName()+"的关注公众号信息!");
+            }
+        }
+    }
 }

+ 123 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/controller/OaWxSendLogController.java

@@ -0,0 +1,123 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import jakarta.annotation.Resource;
+import jakarta.validation.constraints.NotEmpty;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.biz.modular.oawxsendlog.entity.OaWxSendLog;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogAddParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogEditParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogIdParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogPageParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.service.OaWxSendLogService;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 微信消息推送日志控制器
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ */
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class OaWxSendLogController {
+
+    @Resource
+    private OaWxSendLogService oaWxSendLogService;
+
+    /**
+     * 获取微信消息推送日志分页
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    @ApiOperationSupport(order = 1)
+    @SaCheckPermission("/biz/oawxsendlog/page")
+    @GetMapping("/biz/oawxsendlog/page")
+    public CommonResult<Page<OaWxSendLog>> page(OaWxSendLogPageParam oaWxSendLogPageParam) {
+        return CommonResult.data(oaWxSendLogService.page(oaWxSendLogPageParam));
+    }
+
+    /**
+     * 添加微信消息推送日志
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    @ApiOperationSupport(order = 2)
+    @CommonLog("添加微信消息推送日志")
+    @SaCheckPermission("/biz/oawxsendlog/add")
+    @PostMapping("/biz/oawxsendlog/add")
+    public CommonResult<String> add(@RequestBody @Valid OaWxSendLogAddParam oaWxSendLogAddParam) {
+        oaWxSendLogService.add(oaWxSendLogAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑微信消息推送日志
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    @ApiOperationSupport(order = 3)
+    @CommonLog("编辑微信消息推送日志")
+    @SaCheckPermission("/biz/oawxsendlog/edit")
+    @PostMapping("/biz/oawxsendlog/edit")
+    public CommonResult<String> edit(@RequestBody @Valid OaWxSendLogEditParam oaWxSendLogEditParam) {
+        oaWxSendLogService.edit(oaWxSendLogEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除微信消息推送日志
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    @ApiOperationSupport(order = 4)
+    @CommonLog("删除微信消息推送日志")
+    @SaCheckPermission("/biz/oawxsendlog/delete")
+    @PostMapping("/biz/oawxsendlog/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                       List<OaWxSendLogIdParam> oaWxSendLogIdParamList) {
+        oaWxSendLogService.delete(oaWxSendLogIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取微信消息推送日志详情
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    @ApiOperationSupport(order = 5)
+    @SaCheckPermission("/biz/oawxsendlog/detail")
+    @GetMapping("/biz/oawxsendlog/detail")
+    public CommonResult<OaWxSendLog> detail(@Valid OaWxSendLogIdParam oaWxSendLogIdParam) {
+        return CommonResult.data(oaWxSendLogService.detail(oaWxSendLogIdParam));
+    }
+}

+ 51 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/entity/OaWxSendLog.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 微信消息推送日志实体
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+@Getter
+@Setter
+@TableName("oa_wx_send_log")
+public class OaWxSendLog {
+
+    /** 微信推送消息记录表id */
+    @TableId
+    private String id;
+
+    /** 发送人 */
+    private String sendUserId;
+
+    /** 发送人姓名 */
+    private String sendUserName;
+
+    /** 发送的消息 */
+    private String sendMsg;
+
+    /** 微信返回的消息 */
+    private String backMsg;
+
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/enums/OaWxSendLogEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.enums;
+
+import lombok.Getter;
+
+/**
+ * 微信消息推送日志枚举
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+@Getter
+public enum OaWxSendLogEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    OaWxSendLogEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/mapper/OaWxSendLogMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.oawxsendlog.entity.OaWxSendLog;
+
+/**
+ * 微信消息推送日志Mapper接口
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+public interface OaWxSendLogMapper extends BaseMapper<OaWxSendLog> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/mapper/mapping/OaWxSendLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.biz.modular.oawxsendlog.mapper.OaWxSendLogMapper">
+
+</mapper>

+ 44 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogAddParam.java

@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.param;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 微信消息推送日志添加参数
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+@Getter
+@Setter
+public class OaWxSendLogAddParam {
+
+    /** 发送人 */
+    private Long sendUserId;
+
+    /** 发送人姓名 */
+    private String sendUserName;
+
+    /** 发送的消息 */
+    private String sendMsg;
+
+    /** 微信返回的消息 */
+    private String backMsg;
+
+}

+ 48 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogEditParam.java

@@ -0,0 +1,48 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.param;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 微信消息推送日志编辑参数
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+@Getter
+@Setter
+public class OaWxSendLogEditParam {
+
+    /** 微信推送消息记录表id */
+    @NotNull(message = "id不能为空")
+    private String id;
+
+    /** 发送人 */
+    private Long sendUserId;
+
+    /** 发送人姓名 */
+    private String sendUserName;
+
+    /** 发送的消息 */
+    private String sendMsg;
+
+    /** 微信返回的消息 */
+    private String backMsg;
+
+}

+ 33 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogIdParam.java

@@ -0,0 +1,33 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.param;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+
+/**
+ * 微信消息推送日志Id参数
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+@Getter
+@Setter
+public class OaWxSendLogIdParam {
+
+    /** 微信推送消息记录表id */
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 45 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/param/OaWxSendLogPageParam.java

@@ -0,0 +1,45 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.param;
+
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 微信消息推送日志查询参数
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+@Getter
+@Setter
+public class OaWxSendLogPageParam {
+
+    /** 当前页 */
+    private Integer current;
+
+    /** 每页条数 */
+    private Integer size;
+
+    /** 排序字段 */
+    private String sortField;
+
+    /** 排序方式 */
+    private String sortOrder;
+
+    /** 关键词 */
+    private String searchKey;
+
+}

+ 80 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/service/OaWxSendLogService.java

@@ -0,0 +1,80 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.oawxsendlog.entity.OaWxSendLog;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogAddParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogEditParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogIdParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogPageParam;
+
+import java.util.List;
+
+/**
+ * 微信消息推送日志Service接口
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+public interface OaWxSendLogService extends IService<OaWxSendLog> {
+
+    /**
+     * 获取微信消息推送日志分页
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    Page<OaWxSendLog> page(OaWxSendLogPageParam oaWxSendLogPageParam);
+
+    /**
+     * 添加微信消息推送日志
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    void add(OaWxSendLogAddParam oaWxSendLogAddParam);
+
+    /**
+     * 编辑微信消息推送日志
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    void edit(OaWxSendLogEditParam oaWxSendLogEditParam);
+
+    /**
+     * 删除微信消息推送日志
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    void delete(List<OaWxSendLogIdParam> oaWxSendLogIdParamList);
+
+    /**
+     * 获取微信消息推送日志详情
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     */
+    OaWxSendLog detail(OaWxSendLogIdParam oaWxSendLogIdParam);
+
+    /**
+     * 获取微信消息推送日志详情
+     *
+     * @author xiaofan
+     * @date  2023/12/18 15:24
+     **/
+    OaWxSendLog queryEntity(String id);
+}

+ 94 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/oawxsendlog/service/impl/OaWxSendLogServiceImpl.java

@@ -0,0 +1,94 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.oawxsendlog.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.oawxsendlog.entity.OaWxSendLog;
+import vip.xiaonuo.biz.modular.oawxsendlog.mapper.OaWxSendLogMapper;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogAddParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogEditParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogIdParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.param.OaWxSendLogPageParam;
+import vip.xiaonuo.biz.modular.oawxsendlog.service.OaWxSendLogService;
+
+import java.util.List;
+
+/**
+ * 微信消息推送日志Service接口实现类
+ *
+ * @author xiaofan
+ * @date  2023/12/18 15:24
+ **/
+@Service
+public class OaWxSendLogServiceImpl extends ServiceImpl<OaWxSendLogMapper, OaWxSendLog> implements OaWxSendLogService {
+
+    @Override
+    public Page<OaWxSendLog> page(OaWxSendLogPageParam oaWxSendLogPageParam) {
+        QueryWrapper<OaWxSendLog> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(oaWxSendLogPageParam.getSortField(), oaWxSendLogPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(oaWxSendLogPageParam.getSortOrder());
+            queryWrapper.orderBy(true, oaWxSendLogPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(oaWxSendLogPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(OaWxSendLog::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(OaWxSendLogAddParam oaWxSendLogAddParam) {
+        OaWxSendLog oaWxSendLog = BeanUtil.toBean(oaWxSendLogAddParam, OaWxSendLog.class);
+        this.save(oaWxSendLog);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(OaWxSendLogEditParam oaWxSendLogEditParam) {
+        OaWxSendLog oaWxSendLog = this.queryEntity(oaWxSendLogEditParam.getId());
+        BeanUtil.copyProperties(oaWxSendLogEditParam, oaWxSendLog);
+        this.updateById(oaWxSendLog);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<OaWxSendLogIdParam> oaWxSendLogIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(oaWxSendLogIdParamList, OaWxSendLogIdParam::getId));
+    }
+
+    @Override
+    public OaWxSendLog detail(OaWxSendLogIdParam oaWxSendLogIdParam) {
+        return this.queryEntity(oaWxSendLogIdParam.getId());
+    }
+
+    @Override
+    public OaWxSendLog queryEntity(String id) {
+        OaWxSendLog oaWxSendLog = this.getById(id);
+        if(ObjectUtil.isEmpty(oaWxSendLog)) {
+            throw new CommonException("微信消息推送日志不存在,id值为:{}", id);
+        }
+        return oaWxSendLog;
+    }
+}

+ 4 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/user/entity/BizUser.java

@@ -291,4 +291,8 @@ public class BizUser extends CommonEntity {
 
     @Schema(description = "客户账号ID")
     private String customerAccountId;
+
+    private String openId;
+
+    private String unionId;
 }

+ 141 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/HttpClientUtil.java

@@ -0,0 +1,141 @@
+package vip.xiaonuo.biz.modular.utils;
+
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+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.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *@PackageName:com.whzl.common.core.wxConfig
+ *@ClassName:HttpClientUtil
+ *@Description
+ *@author 徐超
+ *@date 2021-07-05 9:59
+ */
+
+public class HttpClientUtil {
+
+    public static String doGet(String url, Map<String, String> param) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
+        String resultString = "";
+        CloseableHttpResponse response = null;
+        try {
+            // 创建uri
+            URIBuilder builder = new URIBuilder(url);
+            if (param != null) {
+                for (String key : param.keySet()) {
+                    builder.addParameter(key, param.get(key));
+                }
+            }
+            URI uri = builder.build();
+
+            // 创建http GET请求
+            HttpGet httpGet = new HttpGet(uri);
+
+            // 执行请求
+            response = httpclient.execute(httpGet);
+            // 判断返回状态是否为200
+            if (response.getStatusLine().getStatusCode() == 200) {
+                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                httpclient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return resultString;
+    }
+
+    public static String doGet(String url) {
+        return doGet(url, null);
+    }
+
+    public static String doPost(String url, Map<String, String> param) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建参数列表
+            if (param != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (String key : param.keySet()) {
+                    paramList.add(new BasicNameValuePair(key, param.get(key)));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doPost(String url) {
+        return doPost(url, null);
+    }
+
+    public static String doPostJson(String url, String json) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建请求内容
+            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
+            httpPost.setEntity(entity);
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+}

+ 4 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/SysUser.java

@@ -291,4 +291,8 @@ public class SysUser extends CommonEntity {
 
     /**客户id*/
     private String customerId;
+
+    private String openId;
+
+    private String unionId;
 }

+ 8 - 2
snowy-web-app/src/main/resources/application-local.properties

@@ -208,5 +208,11 @@ snowy.config.common.mqtt-clientId=my-mqtt-client-id
 #?????
 snowy.config.common.official-token=jswhzl
 snowy.config.common.official-aeskey=YFalph4k6OpXoSnBdV5Z3qpJC6MpGJ3KKgN3sRCPuqk
-snowy.config.common.official-appId=wx0b5b039f123f51d9
-snowy.config.common.official-secret=b724494616d4e1ca74cd4f71c2f6cfee
+snowy.config.common.official-appId=wx9d5137c18baff539
+snowy.config.common.official-secret=f65b18b700a565931518f2973a60ccb4
+snowy.config.common.official-templete=eymriLvPLWYbK8VQcZGge-5F6lr4h8BIvsRG-3etuSw
+
+#???
+snowy.config.common.program-appId=wxb725a84ac0477e4d
+snowy.config.common.program-secret=1665e2ed5789809f695c9514317083c4
+