fanzherong_v 2 mesiacov pred
rodič
commit
4a3fc16368
19 zmenil súbory, kde vykonal 548 pridanie a 14 odobranie
  1. 4 0
      snowy-admin-web/src/api/biz/bizOrderApi.js
  2. 31 2
      snowy-admin-web/src/views/biz/bizorder/index.vue
  3. 16 0
      snowy-admin-web/src/views/biz/record/detail.vue
  4. 6 0
      snowy-common/src/main/java/vip/xiaonuo/common/prop/CommonProperties.java
  5. 71 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/controller/ApiController.java
  6. 167 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/api/service/ApiService.java
  7. 14 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/controller/BizOrderController.java
  8. 3 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/BizOrderService.java
  9. 8 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/impl/BizOrderServiceImpl.java
  10. 12 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizvehicle/controller/BizVehicleController.java
  11. 5 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizvehicle/service/BizVehicleService.java
  12. 19 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizvehicle/service/impl/BizVehicleServiceImpl.java
  13. 1 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/entity/BizRecord.java
  14. 1 1
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/param/BizRecordEditParam.java
  15. 18 9
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/service/impl/BizRecordServiceImpl.java
  16. 45 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/MsgUtil.java
  17. 78 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/SignUtil.java
  18. 43 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/XmlUtil.java
  19. 6 0
      snowy-web-app/src/main/resources/application-local.properties

+ 4 - 0
snowy-admin-web/src/api/biz/bizOrderApi.js

@@ -58,5 +58,9 @@ export default {
 	//订单审核
 	auditOrder(data){
 		return request('auditOrder',data)
+	},
+	//提交
+	submit(data){
+		return request('submit',data)
 	}
 }

+ 31 - 2
snowy-admin-web/src/views/biz/bizorder/index.vue

@@ -145,11 +145,14 @@
 								<a-menu-item>
 									<a size="small" type="link" @click="detailRef.onOpen(record)" >详情</a>
 								</a-menu-item>
-								<a-menu-item v-if="hasPerm('bizOrderEdit') && (record.orderStatus == '1' || record.orderStatus == '2')">
+								<a-menu-item  v-if="hasPerm('bizOrderSubmit') && record.orderStatus=='0'">
+									<a style="color:orangered" size="small" type="link" @click="submit(record.id)">提交</a>
+								</a-menu-item>
+								<a-menu-item v-if="hasPerm('bizOrderEdit') && (record.orderStatus == '0')">
 									<a style="color:blue" size="small" type="link" @click="formRef.onOpen(record)" >编辑</a>
 								</a-menu-item>
 
-								<a-menu-item v-if="hasPerm('bizOrderDelete') && (record.orderStatus == '1' || record.orderStatus == '2')">
+								<a-menu-item v-if="hasPerm('bizOrderDelete') && (record.orderStatus == '0' || record.orderStatus == '1')">
 									<a style="color:red" size="small" type="link" @click="deleteConfig(record)">删除</a>
 								</a-menu-item>
 
@@ -470,6 +473,32 @@
 			onCancel() {}
 		})
 	}
+
+	//提交
+	const submit = (id) =>{
+		Modal.confirm({
+			title: '提示',
+			icon: createVNode(ExclamationCircleOutlined),
+			content: '是否提交该数据?',
+			onOk() {
+				submitLoading.value = true
+				let params =
+					{
+						id: id
+					}
+
+				bizOrderApi
+					.submit(params)
+					.then(() => {
+						tableRef.value.refresh(true)
+					})
+					.finally(() => {
+						submitLoading.value = false
+					})
+			},
+			onCancel() {}
+		})
+	}
 	// 删除
 	const deleteBizOrder = (record) => {
 		let params = [

+ 16 - 0
snowy-admin-web/src/views/biz/record/detail.vue

@@ -76,6 +76,22 @@
 		<a-space>
 			<a-image :width="200" :src="formData.driverSign" />
 		</a-space>
+		<a-divider></a-divider>
+		<a-descriptions title="司机回签" style="margin-top: 15px">
+			<a-descriptions-item label="卸货重量"><a-tag color="green">{{ formData.unloadWeight }} KG</a-tag></a-descriptions-item>
+		</a-descriptions>
+		<a-space>
+			<div v-for="(item,index) in fileList " :key="item.value">
+				<a-image :width="200" :src="item.url" />
+			</div>
+
+		</a-space>
+		<a-divider></a-divider>
+		<a-descriptions title="平台手签" style="margin-top: 15px">
+		</a-descriptions>
+		<a-space>
+			<a-image :width="200" :src="formData.auditSign" />
+		</a-space>
 		<template #footer>
 			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
 		</template>

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

@@ -42,5 +42,11 @@ public class CommonProperties {
 
     private String mqttPassword;
 
+    /**微信公众号*/
+    private String officialToken;
+    private String officialAppId;
+    private String officialAeskey;
+    private String officialSecret;
+
 
 }

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

@@ -0,0 +1,71 @@
+package vip.xiaonuo.biz.modular.api.controller;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+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 vip.xiaonuo.biz.modular.api.service.ApiService;
+import vip.xiaonuo.biz.modular.utils.SignUtil;
+import vip.xiaonuo.common.prop.CommonProperties;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+@Tag(name = "微信公众号")
+@RestController
+@Validated
+public class ApiController {
+
+    @Resource
+    private CommonProperties commonProperties;
+
+    @Resource
+    private ApiService apiService;
+
+    /***
+     * 微信公众号验证接口
+     * @param request
+     * @param response
+     */
+    @GetMapping("/api/wxOpen")
+    public void get(HttpServletRequest request, HttpServletResponse response) {
+        // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
+        String signature = request.getParameter("signature");
+        // 时间戳
+        String timestamp = request.getParameter("timestamp");
+        // 随机数
+        String nonce = request.getParameter("nonce");
+        // 随机字符串
+        String echostr = request.getParameter("echostr");
+        PrintWriter out = null;
+        try {
+            out = response.getWriter();
+            // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,否则接入失败
+            if (SignUtil.checkSignature(commonProperties.getOfficialToken(), signature, timestamp, nonce)) {
+                out.print(echostr);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
+
+
+    /**
+     * 微信公众号操作事件(包括关注和取消动作操作)
+     *
+     * @param request
+     * @param response
+     */
+    @PostMapping("/api/wxOpen")
+    public void officialCallback(HttpServletRequest request, HttpServletResponse response) {
+        apiService.officialCallback(request, response);
+    }
+}

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

@@ -0,0 +1,167 @@
+package vip.xiaonuo.biz.modular.api.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import jakarta.annotation.Resource;
+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.officialinfo.entity.OfficialInfo;
+import vip.xiaonuo.biz.modular.officialinfo.service.OfficialInfoService;
+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.PrintWriter;
+import java.util.Date;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class ApiService {
+
+    @Resource
+    private OfficialInfoService officialInfoService;
+
+    @Resource
+    private CommonProperties commonProperties;
+
+    public static JSONObject wx_token_map = new JSONObject();
+
+    public void officialCallback(HttpServletRequest request, HttpServletResponse response) {
+        // 响应消息
+        PrintWriter out = null;
+        String resMessage = "";
+        try {
+            request.setCharacterEncoding("UTF-8");
+            response.setCharacterEncoding("UTF-8");
+            //把微信返回的xml信息转义成map
+            Map<String, Object> map = XmlUtil.parseXML(request.getInputStream());
+            //消息来源用户标识
+            String fromUserName = (String) map.get("FromUserName");
+            //消息目的用户标识
+            String toUserName = (String) map.get("ToUserName");
+            //消息创建时间(整型)
+            String createTime = (String) map.get("CreateTime");
+            //消息类型
+            String msgType = (String) map.get("MsgType");
+            //事件类型:subscribe/unsubscribe
+            String eventType = (String) map.get("Event");
+            //如果为事件类型
+            if (MsgUtil.MSGTYPE_EVENT.equals(msgType)) {
+                //查询是否存在公众号表记录
+                QueryWrapper<OfficialInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.lambda().eq(OfficialInfo::getOfficialOpenId, fromUserName)
+                        .last("limit 1");
+                OfficialInfo officialInfo = officialInfoService.getOne(queryWrapper);
+                if (officialInfo == null) {
+                    officialInfo = new OfficialInfo();
+                    JSONObject jsonObject = this.getUserInfo(fromUserName);
+                    if (jsonObject != null) {
+                        officialInfo.setWxAddress(jsonObject.getString("country")
+                                + jsonObject.getString("province")
+                                + jsonObject.getString("city"));
+                        officialInfo.setCreateTime(new Date());
+                        officialInfo.setNickName(jsonObject.getString("nickname"));
+                        officialInfo.setOfficialOpenId(jsonObject.getString("openid"));
+                        officialInfo.setUnionId(jsonObject.getString("unionid"));
+                        officialInfo.setWxHead(jsonObject.getString("headimgurl"));
+                        officialInfoService.save(officialInfo);
+                    }
+                }
+                //处理订阅事件-关注与取消关注
+                if (MsgUtil.MESSAGE_SUBSCIBE.equals(eventType)) {
+                    officialInfo.setStatus(1);
+                    System.out.println("您好,谢谢您的关注!!");
+                    if (ObjectUtil.isEmpty(officialInfo.getUnionId())) {
+                        JSONObject jsonObject = this.getUserInfo(fromUserName);
+                        if (jsonObject != null) {
+                            officialInfo.setUnionId(jsonObject.getString("unionid"));
+                        }
+                    }
+                    resMessage = MsgUtil.subscribeForText(toUserName, fromUserName, "您好,谢谢您的关注!!");
+                } else if (MsgUtil.MESSAGE_UNSUBSCIBE.equals(eventType)) {//取消订阅
+                    officialInfo.setStatus(0);
+                    resMessage = MsgUtil.unsubscribeForText(toUserName, fromUserName, "取消关注~");
+                }
+                officialInfoService.updateById(officialInfo);
+                log.info("eventType:" + eventType + ",fromUserName:" + fromUserName + ",toUserName:" + toUserName + ",msgType:" + msgType + ",createTime:" + createTime);
+            }
+            out = response.getWriter();
+            out.println(resMessage);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("公众号回调异常------", e.getMessage());
+            //itemErrorInfoService.errorAdd(e);
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
+
+
+    /**
+     * 微信公众号的appid以及sercet
+     *
+     * @param openId
+     * @return
+     */
+    private JSONObject getUserInfo(String openId) {
+        JSONObject jsonObject = null;
+        String accessToken = getAccessToken(commonProperties.getOfficialAppId(), commonProperties.getOfficialSecret());
+        log.info("-------openId:" + openId + "-------");
+        log.info("-------accessToken:" + accessToken + "-------");
+        StringBuffer url = new StringBuffer("https://api.weixin.qq.com/cgi-bin/user/info");
+        url.append("?access_token=").append(accessToken);
+        url.append("&openid=").append(openId);
+        url.append("&lang=zh_CN");
+
+        String content = HttpUtil.get(url.toString());
+        if (ObjectUtil.isNotEmpty(content)) {
+            jsonObject = JSONObject.parseObject(content);
+        }
+        log.info("-------微信用户信息:" + content + "-------");
+        return jsonObject;
+    }
+
+
+    private String getAccessToken(String sAppid, String sSecret) {
+        // 因为微信有限制次数跟有效期,所以需要存在redis中
+        if (wx_token_map.size() == 0) {
+            wx_token_map.put("token", null);
+        }
+        String token = wx_token_map.getString("token");
+        // token失效或者为空
+        if (StrUtil.isEmpty(token) || "null".equals(token)) {
+            StringBuffer url = new StringBuffer("https://api.weixin.qq.com/cgi-bin/token");
+            url.append("?grant_type=client_credential");
+            url.append("&appid=").append(sAppid);
+            url.append("&secret=").append(sSecret);
+            log.info(url.toString());
+            String content = HttpUtil.get(url.toString());
+            if (StrUtil.isEmpty(content) || !content.contains("access_token")) {
+                log.info(content);
+                throw new CommonException("获取公众号accessToken失败");
+            }
+            token = JSONObject.parseObject(content).getString("access_token");
+            // 设置为1.9h(有效期2h)
+            wx_token_map.put("token", token);
+            wx_token_map.put("time", System.currentTimeMillis());
+        } else {
+            Long time = wx_token_map.getLong("time");
+            long l = System.currentTimeMillis();
+            if ((l - time) >= 1.9 * 3600 * 1000) {
+                wx_token_map.clear();
+                getAccessToken(sAppid, sSecret);
+            }
+
+        }
+        return token;
+    }
+}

+ 14 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/controller/BizOrderController.java

@@ -243,4 +243,18 @@ public class BizOrderController {
         bizOrderService.auditOrder(bizOrderEditParam);
         return CommonResult.ok();
     }
+
+    /**
+     * 订单提交
+     *
+     * @author fanzherong
+     * @date  2025/03/21 17:16
+     */
+    @Operation(summary = "订单提交")
+    @CommonLog("订单提交")
+    @PostMapping("/biz/bizorder/submit")
+    public CommonResult<String> submit(@RequestBody @Valid BizOrderEditParam bizOrderEditParam) {
+        bizOrderService.submit(bizOrderEditParam);
+        return CommonResult.ok();
+    }
 }

+ 3 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/BizOrderService.java

@@ -108,4 +108,7 @@ public interface BizOrderService extends IService<BizOrder> {
 
     /**审核**/
     void auditOrder(BizOrderEditParam bizOrderEditParam);
+
+    /**提交*/
+    void submit(BizOrderEditParam bizOrderEditParam);
 }

+ 8 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizorder/service/impl/BizOrderServiceImpl.java

@@ -133,7 +133,7 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
         bizOrder.setOrderWeight(bizOrder.getOrderWeight().multiply(new BigDecimal(1000)));
         //来源,手动新增
         bizOrder.setOrderSource("2");
-        bizOrder.setOrderStatus("1");
+        bizOrder.setOrderStatus("0");
         this.save(bizOrder);
 
         //修改时段配置内物品重量
@@ -369,6 +369,13 @@ public class BizOrderServiceImpl extends ServiceImpl<BizOrderMapper, BizOrder> i
         }
     }
 
+    @Override
+    public void submit(BizOrderEditParam bizOrderEditParam) {
+        BizOrder bizOrder = this.queryEntity(bizOrderEditParam.getId());
+        bizOrder.setOrderStatus("1");
+        this.updateById(bizOrder);
+    }
+
     public static void main(String[] args) {
         String result = "";
         try {

+ 12 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizvehicle/controller/BizVehicleController.java

@@ -116,4 +116,16 @@ public class BizVehicleController {
     public CommonResult<BizVehicle> detail(@Valid BizVehicleIdParam bizVehicleIdParam) {
         return CommonResult.data(bizVehicleService.detail(bizVehicleIdParam));
     }
+
+    /**
+     * 获取个人长期车辆
+     *
+     * @author fanzherong
+     * @date  2025/04/08 09:26
+     */
+    @Operation(summary = "获取个人长期车辆")
+    @GetMapping("/biz/bizvehicle/queryByUserId")
+    public CommonResult<BizVehicle> queryByUserId() {
+        return CommonResult.data(bizVehicleService.queryByUserId());
+    }
 }

+ 5 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizvehicle/service/BizVehicleService.java

@@ -77,4 +77,9 @@ public interface BizVehicleService extends IService<BizVehicle> {
      * @date  2025/04/08 09:26
      **/
     BizVehicle queryEntity(String id);
+
+    /**
+     * 个人长期车辆接口
+     */
+    BizVehicle queryByUserId();
 }

+ 19 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/bizvehicle/service/impl/BizVehicleServiceImpl.java

@@ -22,9 +22,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.biz.modular.bizexcessconfig.entity.BizExcessConfig;
+import vip.xiaonuo.biz.modular.bizexcessconfig.service.BizExcessConfigService;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.page.CommonPageRequest;
@@ -49,6 +52,9 @@ import java.util.regex.Pattern;
 @Service
 public class BizVehicleServiceImpl extends ServiceImpl<BizVehicleMapper, BizVehicle> implements BizVehicleService {
 
+    @Resource
+    private BizExcessConfigService bizExcessConfigService;
+
     @Override
     public Page<BizVehicle> page(BizVehiclePageParam bizVehiclePageParam) {
         QueryWrapper<BizVehicle> queryWrapper = new QueryWrapper<BizVehicle>().checkSqlInjection();
@@ -199,6 +205,19 @@ public class BizVehicleServiceImpl extends ServiceImpl<BizVehicleMapper, BizVehi
         return bizVehicle;
     }
 
+    @Override
+    public BizVehicle queryByUserId() {
+        BizVehicle bizVehicle = this.getOne(new QueryWrapper<BizVehicle>().lambda().
+                eq(BizVehicle::getStatus, "1").
+                eq(BizVehicle::getCreateUser, StpLoginUserUtil.getLoginUser().getId()).
+                last("limit 1"));
+        BizExcessConfig excessConfig = bizExcessConfigService.getById(bizVehicle.getVehicleAxles());
+        if(ObjectUtil.isNotNull(excessConfig)){
+            bizVehicle.setVehicleAxleNumber(excessConfig.getVehicleAxleNumber().toString());
+        }
+        return bizVehicle;
+    }
+
     /**
      * 车牌号校验
      * @param carNumber

+ 1 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/entity/BizRecord.java

@@ -219,5 +219,5 @@ public class BizRecord extends CommonEntity {
     private String unloadImg;
     private String unloadName;
 
-    private String auditReason;
+    private String auditSign;
 }

+ 1 - 1
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/param/BizRecordEditParam.java

@@ -198,6 +198,6 @@ public class BizRecordEditParam {
 
     private String auditFlag;
 
-    private String auditReason;
+    private String auditSign;
 
 }

+ 18 - 9
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/record/service/impl/BizRecordServiceImpl.java

@@ -143,7 +143,7 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
             queryWrapper.like("br.TRANSPORT_COMPANY",bizRecordPageParam.getTransportCompany());
         }
         if (ObjectUtil.isNotEmpty(bizRecordPageParam.getIsFlag())){
-            queryWrapper.eq("br.weighing_type","1");
+            //queryWrapper.eq("br.weighing_type","1");
         }
         if (ObjectUtil.isNotEmpty(bizRecordPageParam.getSignFlag())){
             queryWrapper.in("bar.status","10","11","12","13");
@@ -644,15 +644,24 @@ public class BizRecordServiceImpl extends ServiceImpl<BizRecordMapper, BizRecord
     @Override
     public void auditRecord(BizRecordEditParam bizRecordEditParam) {
         BizRecord bizRecord = this.queryEntity(bizRecordEditParam.getId());
-        bizRecord.setAuditReason(bizRecordEditParam.getAuditReason());
+        if(ObjectUtil.isEmpty(bizRecordEditParam.getAuditSign())){
+            throw new CommonException("签名不能为空!");
+        }
+        String auditSign = bizRecordEditParam.getAuditSign();
+        if(bizRecordEditParam.getAuditSign().contains(StrUtil.COMMA)) {
+            auditSign = StrUtil.split(auditSign, StrUtil.COMMA).get(1);
+        }
+        String base64 = ImgUtil.toBase64DataUri(ImgUtil.scale(ImgUtil.toImage(auditSign),
+                100, 50, null), ImgUtil.IMAGE_TYPE_PNG);
+
+        bizRecord.setAuditSign(base64);
         this.updateById(bizRecord);
-        if(ObjectUtil.isNotEmpty(bizRecordEditParam.getAuditFlag())){
-            //查询预约记录
-            BizAppointmentRecord appointmentRecord = bizAppointmentRecordService.getById(bizRecord.getAppointmentId());
-            if(ObjectUtil.isNotNull(appointmentRecord)){
-                appointmentRecord.setStatus("13");
-                bizAppointmentRecordService.updateById(appointmentRecord);
-            }
+
+        //查询预约记录
+        BizAppointmentRecord appointmentRecord = bizAppointmentRecordService.getById(bizRecord.getAppointmentId());
+        if(ObjectUtil.isNotNull(appointmentRecord)){
+            appointmentRecord.setStatus("13");
+            bizAppointmentRecordService.updateById(appointmentRecord);
         }
     }
 }

+ 45 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/MsgUtil.java

@@ -0,0 +1,45 @@
+package vip.xiaonuo.biz.modular.utils;
+
+/**
+ * @author liuqh
+ * @date 2020-02-20 10:10
+ * @description
+ */
+public class MsgUtil {
+
+    public static final String MSGTYPE_EVENT = "event";//消息类型--事件
+    public static final String MESSAGE_SUBSCIBE = "subscribe";//消息事件类型--订阅事件
+    public static final String MESSAGE_UNSUBSCIBE = "unsubscribe";//消息事件类型--取消订阅事件
+    public static final String MESSAGE_TEXT = "text";//消息类型--文本消息
+
+    /**
+     * 组装文本消息
+     */
+    public static String textMsg(String toUserName,String fromUserName,String content){
+//        TextMsg text = new TextMsg();
+//        text.setFromUserName(toUserName);
+//        text.setToUserName(fromUserName);
+//        text.setMsgType(MESSAGE_TEXT);
+//        text.setCreateTime(new Date().getTime());
+//        text.setContent(content);
+//        return XmlUtil.textMsgToxml(text);
+        return null;
+    }
+
+    /**
+     * 响应订阅事件--回复文本消息
+     */
+    public static String subscribeForText(String toUserName,String fromUserName,String content){
+        return textMsg(toUserName, fromUserName, content);
+    }
+
+    /**
+     * 响应取消订阅事件
+     */
+    public static String unsubscribeForText(String toUserName,String fromUserName,String content){
+        System.out.println("用户:"+ fromUserName +"取消关注~");
+        return "";
+    }
+}
+
+

+ 78 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/SignUtil.java

@@ -0,0 +1,78 @@
+package vip.xiaonuo.biz.modular.utils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * @author liuqh
+ * @date 2019-08-13 16:20
+ * @description
+ */
+public class SignUtil {
+
+    /**
+     * 验证签名
+     * @param token
+     * @param signature 签名用来核实最后的结果是否一致
+     * @param timestamp 时间标记
+     * @param nonce 随机数字标记
+     * @return 一个布尔值确定最后加密得到的是否与signature一致
+     */
+    public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {
+        //将传入参数变成一个String数组然后进行字典排序
+        String[] arr = new String[] { token, timestamp, nonce };
+        // 将token、timestamp、nonce三个参数进行字典排序
+        Arrays.sort(arr);
+        //创建一个对象储存排序后三个String的结合体
+        StringBuilder content = new StringBuilder();
+        for (int i = 0; i < arr.length; i++) {
+            content.append(arr[i]);
+        }
+        MessageDigest md = null;
+        String tmpStr = null;
+
+        try {
+            md = MessageDigest.getInstance("SHA-1");
+            byte[] digest = md.digest(content.toString().getBytes());
+            tmpStr = byteToStr(digest);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+
+        content = null;
+        // 将sha1加密后的字符串可与signature对比
+        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
+    }
+
+    /**
+     * 将字节数组转换为十六进制字符串
+     * @param byteArray
+     * @return
+     */
+    private static String byteToStr(byte[] byteArray) {
+        String strDigest = "";
+        for (int i = 0; i < byteArray.length; i++) {
+            strDigest += byteToHexStr(byteArray[i]);
+        }
+        return strDigest;
+    }
+
+    /**
+     * 将每一个字节转换为十六进制字符串
+     * @param mByte
+     * @return
+     */
+    private static String byteToHexStr(byte mByte) {
+        //转位数参照表
+        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+        char[] tempArr = new char[2];
+        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
+        tempArr[1] = Digit[mByte & 0X0F];
+        //得到进制码的字符串
+        String s = new String(tempArr);
+        return s;
+    }
+}
+
+

+ 43 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/utils/XmlUtil.java

@@ -0,0 +1,43 @@
+package vip.xiaonuo.biz.modular.utils;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class XmlUtil {
+
+
+    /**
+     * 简单解析xml
+     * @param in
+     * @return
+     */
+    public static Map<String,Object> parseXML(InputStream in){
+
+
+        Map<String,Object> map=new HashMap<>();
+        try {
+            SAXReader saxReader = new SAXReader();
+            Document document = saxReader.read(in);
+            Element root = document.getRootElement();
+            Iterator iterator = root.elementIterator();
+            while (iterator.hasNext()){
+
+                Element element = (Element) iterator.next();
+                map.put(element.getName(),element.getStringValue());
+
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+
+        return map;
+    }
+
+}

+ 6 - 0
snowy-web-app/src/main/resources/application-local.properties

@@ -204,3 +204,9 @@ snowy.config.common.mqtt-url=tcp://127.0.0.1:1883
 snowy.config.common.mqtt-name=admin
 snowy.config.common.mqtt-password=public
 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