From e8858df15a89365287aa9ac783deee44678655bf Mon Sep 17 00:00:00 2001
From: zhouxiantao <1026371446@qq.com>
Date: Fri, 06 Sep 2024 14:27:05 +0800
Subject: [PATCH] 小程序案件
---
dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java | 78 +++
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseInfoWeChatDTO.java | 53 ++
dyh-service/dyh-sys/pom.xml | 17
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml | 13
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java | 260 ++++++++++
dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/config/XfyunConfig.java | 81 +++
dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java | 2
dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/iflytek/WebIATWS.java | 392 ++++++++++++++++
dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/controller/client/PaUserClientController.java | 207 ++++++++
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/wechat/CaseInfoWechatController.java | 149 ++++++
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java | 1
dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/service/PaUserService.java | 10
dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/GuavaCacheUtils.java | 45 +
dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/CustClient.java | 1
dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/controller/wechat/XfyunWechatController.java | 66 ++
dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePersonWechatDTO.java | 30 +
16 files changed, 1,402 insertions(+), 3 deletions(-)
diff --git a/dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/GuavaCacheUtils.java b/dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/GuavaCacheUtils.java
new file mode 100644
index 0000000..e9245c0
--- /dev/null
+++ b/dyh-service/dyh-base/src/main/java/cn/huge/base/common/utils/GuavaCacheUtils.java
@@ -0,0 +1,45 @@
+package cn.huge.base.common.utils;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import org.springframework.util.ObjectUtils;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 本地缓存工具类
+ * @author zhouxiantao
+ * @create 2024-09-05 10:51
+ */
+public class GuavaCacheUtils {
+ private static Cache<String, Object> cache = CacheBuilder.newBuilder()
+ //5分钟后过期
+ .expireAfterWrite(5, TimeUnit.SECONDS)
+// .expireAfterWrite(10, TimeUnit.SECONDS)
+ //最大10个缓存
+ .maximumSize(10)
+ .build();
+
+
+ public static Object getCache(String k) {
+ return cache.getIfPresent(k);
+ }
+
+ public static void putCache(String k, Object value) {
+ cache.put(k, value);
+ }
+
+ public static void main(String[] args) throws InterruptedException {
+ putCache("15008985673","123456");
+ while (true){
+ Thread.sleep(1000);
+ Object cache = getCache("15008985673");
+ System.out.println(cache);
+ if(ObjectUtils.isEmpty(cache)){
+ System.out.println("结束。。。");
+ return;
+ }
+ }
+ }
+
+}
diff --git a/dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/controller/client/PaUserClientController.java b/dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/controller/client/PaUserClientController.java
new file mode 100644
index 0000000..f56ddf1
--- /dev/null
+++ b/dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/controller/client/PaUserClientController.java
@@ -0,0 +1,207 @@
+package cn.huge.module.pauser.controller.client;
+
+import cn.huge.base.common.utils.ReturnFailUtils;
+import cn.huge.base.common.utils.ReturnSucUtils;
+import cn.huge.base.config.CurrentUser;
+import cn.huge.module.cust.dto.PaUserDTO;
+import cn.huge.module.mediate.dto.WechatBindCaseDTO;
+import cn.huge.module.pauser.domain.po.PaUser;
+import cn.huge.module.pauser.service.PaUserService;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * @title: 公众用户表接口api-wechat端
+ * @description: 公众用户表接口api-wechat端
+ * @company: hugeinfo
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/client/paUser")
+public class PaUserClientController {
+
+ @Autowired(required = false)
+ private HttpServletRequest request;
+
+ @Autowired
+ private PaUserService service;
+
+ /**
+ * 获取请求URL参数
+ * @return Map<String, Object>
+ */
+ private Map<String, Object> getParameter(){
+ Map<String, Object> terms = Maps.newHashMap();
+ // 当事人编号
+ String id = request.getParameter("id");
+ if (StringUtils.isNotBlank(id)){
+ terms.put("id", id);
+ }
+ // 姓名
+ String trueName = request.getParameter("trueName");
+ if (StringUtils.isNotBlank(trueName)){
+ terms.put("trueName", trueName);
+ }
+ // 性别
+ String sex = request.getParameter("sex");
+ if (StringUtils.isNotBlank(sex)){
+ terms.put("sex", sex);
+ }
+ // 性别名称
+ String sexName = request.getParameter("sexName");
+ if (StringUtils.isNotBlank(sexName)){
+ terms.put("sexName", sexName);
+ }
+ // 手机号码
+ String mobile = request.getParameter("mobile");
+ if (StringUtils.isNotBlank(mobile)){
+ terms.put("mobile", mobile);
+ }
+ // 身份证号码
+ String idcard = request.getParameter("idcard");
+ if (StringUtils.isNotBlank(idcard)){
+ terms.put("idcard", idcard);
+ }
+ // 电子邮箱
+ String email = request.getParameter("email");
+ if (StringUtils.isNotBlank(email)){
+ terms.put("email", email);
+ }
+ // 微信号
+ String wechat = request.getParameter("wechat");
+ if (StringUtils.isNotBlank(wechat)){
+ terms.put("wechat", wechat);
+ }
+ // QQ号
+ String qq = request.getParameter("qq");
+ if (StringUtils.isNotBlank(qq)){
+ terms.put("qq", qq);
+ }
+ // 现居地省
+ String prov = request.getParameter("prov");
+ if (StringUtils.isNotBlank(prov)){
+ terms.put("prov", prov);
+ }
+ // 现居地省名称
+ String provName = request.getParameter("provName");
+ if (StringUtils.isNotBlank(provName)){
+ terms.put("provName", provName);
+ }
+ // 现居地市
+ String city = request.getParameter("city");
+ if (StringUtils.isNotBlank(city)){
+ terms.put("city", city);
+ }
+ // 现居地市名称
+ String cityName = request.getParameter("cityName");
+ if (StringUtils.isNotBlank(cityName)){
+ terms.put("cityName", cityName);
+ }
+ // 现居地区
+ String area = request.getParameter("area");
+ if (StringUtils.isNotBlank(area)){
+ terms.put("area", area);
+ }
+ // 现居地区名称
+ String areaName = request.getParameter("areaName");
+ if (StringUtils.isNotBlank(areaName)){
+ terms.put("areaName", areaName);
+ }
+ // 现居地街道
+ String road = request.getParameter("road");
+ if (StringUtils.isNotBlank(road)){
+ terms.put("road", road);
+ }
+ // 现居地街道名称
+ String roadName = request.getParameter("roadName");
+ if (StringUtils.isNotBlank(roadName)){
+ terms.put("roadName", roadName);
+ }
+ // 现居地社区
+ String village = request.getParameter("village");
+ if (StringUtils.isNotBlank(village)){
+ terms.put("village", village);
+ }
+ // 现居地社区名称
+ String villageName = request.getParameter("villageName");
+ if (StringUtils.isNotBlank(villageName)){
+ terms.put("villageName", villageName);
+ }
+ // 现居地详细地址
+ String addr = request.getParameter("addr");
+ if (StringUtils.isNotBlank(addr)){
+ terms.put("addr", addr);
+ }
+ // 头像
+ String avatar = request.getParameter("avatar");
+ if (StringUtils.isNotBlank(avatar)){
+ terms.put("avatar", avatar);
+ }
+ // 实名认证状态,0:未认证,1:已认证
+ String realStatus = request.getParameter("realStatus");
+ if (StringUtils.isNotBlank(realStatus)){
+ terms.put("realStatus", realStatus);
+ }
+ // 用户状态,0:停用,1:启用
+ String status = request.getParameter("status");
+ if (StringUtils.isNotBlank(status)){
+ terms.put("status", status);
+ }
+ // 关注纠纷类型,多个用,隔开
+ String followCaseType = request.getParameter("followCaseType");
+ if (StringUtils.isNotBlank(followCaseType)){
+ terms.put("followCaseType", followCaseType);
+ }
+ // 删除状态,0:未删除,1:已删除
+ String deleteStatus = request.getParameter("deleteStatus");
+ if (StringUtils.isNotBlank(deleteStatus)){
+ terms.put("deleteStatus", deleteStatus);
+ }
+ // 客户编号
+ String custId = request.getParameter("custId");
+ if (StringUtils.isNotBlank(custId)){
+ terms.put("custId", custId);
+ }
+ // 创建时间区间
+ String createStart = request.getParameter("createStart");
+ String createEnd = request.getParameter("createEnd");
+ if(StringUtils.isNotBlank(createStart) && StringUtils.isNotBlank(createEnd)) {
+ terms.put("createStart", createStart);
+ terms.put("createEnd", createEnd);
+ }
+ // 更新时间区间
+ String updateStart = request.getParameter("updateStart");
+ String updateEnd = request.getParameter("updateEnd");
+ if(StringUtils.isNotBlank(updateStart) && StringUtils.isNotBlank(updateEnd)) {
+ terms.put("updateStart", updateStart);
+ terms.put("updateEnd", updateEnd);
+ }
+ return terms;
+ }
+
+
+
+ /**
+ * 当事人用户信息
+ * url: {ctx}/api/client/paUser/clientGetUserAll
+ * type: post
+ */
+ @GetMapping(value = "/clientGetUserAll")
+ public Object clientGetUserAll(@RequestParam(value = "userId") String userId) {
+ try {
+ PaUserDTO paUser = service.clientGetUserAll(userId);
+ return ReturnSucUtils.getRepInfo(paUser);
+ } catch (Exception e) {
+ log.error("Controller接口[PaUserClientController.clientGetUserAll]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo(e.getMessage());
+ }
+ }
+
+
+}
diff --git a/dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/service/PaUserService.java b/dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/service/PaUserService.java
index c4cc93f..a4b92bc 100644
--- a/dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/service/PaUserService.java
+++ b/dyh-service/dyh-cust/src/main/java/cn/huge/module/pauser/service/PaUserService.java
@@ -5,6 +5,7 @@
import cn.huge.base.common.utils.IdUtils;
import cn.huge.base.common.utils.ObjectUtils;
import cn.huge.module.client.api.impl.UtilsClientImpl;
+import cn.huge.module.cust.dto.PaUserDTO;
import cn.huge.module.mediate.dto.WechatBindCaseDTO;
import cn.huge.module.cust.constant.UserBaseConsts;
import cn.huge.module.mediate.dto.WechatBindCaseDTO;
@@ -236,5 +237,12 @@
}
}
-
+ public PaUserDTO clientGetUserAll(String userId){
+ PaUserDTO paUserDTO = new PaUserDTO();
+ PaUser paUser = mapper.selectById(userId);
+ if(ObjectUtils.isNotEmpty(paUser)){
+ BeanUtils.copyProperties(paUser, paUserDTO);
+ }
+ return paUserDTO;
+ }
}
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/wechat/CaseInfoWechatController.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/wechat/CaseInfoWechatController.java
new file mode 100644
index 0000000..06fb123
--- /dev/null
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/controller/wechat/CaseInfoWechatController.java
@@ -0,0 +1,149 @@
+package cn.huge.module.cases.controller.wechat;
+
+import cn.huge.base.common.utils.GuavaCacheUtils;
+import cn.huge.base.common.utils.ObjectUtils;
+import cn.huge.base.common.utils.ReturnFailUtils;
+import cn.huge.base.common.utils.ReturnSucUtils;
+import cn.huge.base.config.CurrentUser;
+import cn.huge.module.cases.domain.dto.CaseInfoWeChatDTO;
+import cn.huge.module.cases.domain.dto.RegisterSaveDTO;
+import cn.huge.module.cases.domain.po.CaseInfo;
+import cn.huge.module.cases.service.CaseInfoService;
+import cn.huge.module.client.api.impl.UtilsClientImpl;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @title: 纠纷信息主表接口api-web端
+ * @description: 纠纷信息主表接口api-web端
+ * @company: hugeinfo
+ * @author: wangwh
+ * @time: 2024-08-27 10:00:57
+ * @version: 1.0.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/wechat/caseInfo")
+public class CaseInfoWechatController {
+
+ @Autowired(required = false)
+ private HttpServletRequest request;
+
+ @Autowired
+ private CaseInfoService service;
+ @Autowired
+ private UtilsClientImpl utilsClient;
+
+ /**
+ * 获取请求URL参数
+ * @return Map<String, Object>
+ */
+ private Map<String, Object> getParameter(){
+ Map<String, Object> terms = Maps.newHashMap();
+ // 人员类型,1:我是申请方,2:我是被申请方
+ String personType = request.getParameter("personType");
+ if (StringUtils.isNotBlank(personType)){
+ terms.put("personType", personType);
+ }
+
+ // 事项进度,1:来访登记,2:事件流转,3:办理反馈,4:结案申请,5:当事人评价,6:结案归档
+ String process = request.getParameter("process");
+ if (StringUtils.isNotBlank(process)){
+ terms.put("process", process);
+ }
+ // 办理进度,1:待受理,2:办理中,3:已结案,4:不予受理
+ String processStatus = request.getParameter("processStatus");
+ if (StringUtils.isNotBlank(processStatus)){
+ if("1".equals(processStatus)){
+ List<Integer> processList = Arrays.asList(1,2);
+ terms.put("processList", processList);
+ }else if("2".equals(processStatus)){
+ List<Integer> processList = Arrays.asList(3,4);
+ terms.put("processList", processList);
+ }else if("3".equals(processStatus)){
+ List<Integer> processList = Arrays.asList(5,6);
+ terms.put("processList", processList);
+ }else{
+ List<Integer> processList = Arrays.asList(7);
+ terms.put("processList", processList);
+ }
+ }
+
+ return terms;
+ }
+
+ /**
+ * 条件分页查询
+ * @url {ctx}/api/wechat/caseInfo/pageCard
+ * @param page 页码
+ * @param size 每页数量
+ * @return Object
+ * @CurrentUser String userId,
+ */
+ @GetMapping("/pageCard")
+ public Object pageCard(@RequestParam(value = "page") int page, @RequestParam(value = "size") int size) {
+ try {
+ String userId = "2408301111391000";
+ Map<String, Object> terms = getParameter();
+ Sort sort = Sort.by(Sort.Direction.DESC, "create_time");
+ PageRequest pageRequest = PageRequest.of(page-1, size, sort);
+ Page<CaseInfoWeChatDTO> caseInfoPage = service.pageQueryWechat(userId,pageRequest, terms);
+ return ReturnSucUtils.getRepInfo( "处理成功", caseInfoPage);
+ } catch (Exception e) {
+ log.error("Controller接口[CaseInfoWechatController.pageCard]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo();
+ }
+ }
+
+
+ /**
+ * 小程序端-纠纷登记-保存纠纷信息-正常案件
+ * @url {ctx}/api/v1/caseInfo/caseRegister
+ * @param registerSaveDTO 实体对象
+ */
+ @PostMapping("/caseRegister")
+ public Object caseRegister(@CurrentUser String userId, @RequestBody RegisterSaveDTO registerSaveDTO) {
+ try {
+ Object caseRegister = GuavaCacheUtils.getCache("caseRegister"+userId);
+ if(ObjectUtils.isNotEmpty(caseRegister)){
+ log.info("caseRegister is exist {}",caseRegister);
+ return ReturnSucUtils.getRepInfo(caseRegister);
+ }else{
+ if(ObjectUtils.isEmpty(registerSaveDTO.getId())){
+ registerSaveDTO.setId(utilsClient.getNewTimeCaseId());
+ }
+ GuavaCacheUtils.putCache("caseRegister"+userId,registerSaveDTO.getId());
+ }
+ String caseId = service.caseRegisterWechat(registerSaveDTO, userId);
+ return ReturnSucUtils.getRepInfo(caseId);
+ } catch (Exception e) {
+ log.error("Controller接口[CaseInfoWechatController.caseRegister]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo(e.getMessage());
+ }
+ }
+
+ /**
+ * 小程序端-查看案件详情
+ * @url {ctx}/api/v1/caseInfo/getCaseInfo
+ */
+ @GetMapping("/getCaseInfo")
+ public Object getCaseInfo(@RequestParam(value = "id") String id) {
+ try {
+ return ReturnSucUtils.getRepInfo(service.getCaseInfoWechat(id));
+ } catch (Exception e) {
+ log.error("Controller接口[CaseInfoWechatController.caseInfo]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo(e.getMessage());
+ }
+ }
+}
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java
index 659092a..0ce7586 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/CaseInfoMapper.java
@@ -1,5 +1,6 @@
package cn.huge.module.cases.dao.mapper;
+import cn.huge.module.cases.domain.dto.CaseInfoWeChatDTO;
import cn.huge.module.cases.domain.po.CaseInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml
index 87423e9..25b9fad 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/dao/mapper/xml/CaseInfoMapper.xml
@@ -224,6 +224,12 @@
<sql id="where-part">
<if test="terms != null">
<where>
+ <if test="terms.ids != null and terms.ids.size > 0">
+ and id in
+ <foreach collection="terms.id" item="terms.ids" index="index" open="(" separator="," close=")">
+ #{terms.id}
+ </foreach>
+ </if>
<if test="terms.id != null and terms.id !=''">
and id = #{terms.id}
</if>
@@ -395,6 +401,12 @@
<if test="terms.statusName != null and terms.statusName !=''">
and status_name = #{terms.statusName}
</if>
+ <if test="terms.processList != null and terms.processList.size > 0">
+ and process in
+ <foreach collection="terms.process" item="terms.processList" index="index" open="(" separator="," close=")">
+ #{terms.process}
+ </foreach>
+ </if>
<if test="terms.process != null and terms.process !=''">
and process = #{terms.process}
</if>
@@ -499,4 +511,5 @@
limit #{page.offset}, #{page.size}
</select>
+
</mapper>
\ No newline at end of file
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseInfoWeChatDTO.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseInfoWeChatDTO.java
new file mode 100644
index 0000000..84e6e92
--- /dev/null
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CaseInfoWeChatDTO.java
@@ -0,0 +1,53 @@
+package cn.huge.module.cases.domain.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author zhouxiantao
+ * @create 2024-09-05 10:17
+ */
+@Data
+public class CaseInfoWeChatDTO {
+ /**
+ * 主键编号
+ */
+ private String id;
+ /**
+ * 事项标题
+ */
+ private String caseTitle;
+ /**
+ * 来访时间(申请时间)
+ */
+ private Date visitTime;
+ /**
+ * 事项进度,1:来访登记,2:事件流转,3:办理反馈,4:结案审核,5:当事人评价,6:结案归档
+ */
+ private Integer process;
+
+ /**
+ * 事项进度名称
+ */
+ private String processName;
+
+ /**
+ * 事项进度,1:来访登记,2:事件流转,3:办理反馈,4:结案审核,5:当事人评价,6:结案归档
+ */
+ private Integer processStatus;
+
+ /**
+ * 事项进度名称
+ */
+ private String processStatusName;
+ /**
+ * 申请人集合
+ * */
+ private List<CasePersonWechatDTO> plaintiffList;
+ /**
+ * 被申请人集合
+ * */
+ private List<CasePersonWechatDTO> defendantList;
+}
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePersonWechatDTO.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePersonWechatDTO.java
new file mode 100644
index 0000000..03e43ce
--- /dev/null
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/domain/dto/CasePersonWechatDTO.java
@@ -0,0 +1,30 @@
+package cn.huge.module.cases.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * @author zhouxiantao
+ * @create 2024-09-05 11:36
+ */
+@Data
+public class CasePersonWechatDTO {
+ /**
+ * 姓名/企业/机构名称
+ */
+ private String trueName;
+
+ /**
+ * 联系方式
+ */
+ private String mobile;
+ /**
+ * 当事人地位
+ */
+ private String perType;
+
+ /**
+ * 当事人地位名称
+ */
+ private String perTypeName;
+}
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java
index 381b422..7cc943c 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/cases/service/CaseInfoService.java
@@ -3,9 +3,11 @@
import cn.huge.base.common.exception.ServiceException;
import cn.huge.base.common.utils.DateUtils;
import cn.huge.base.common.utils.IdUtils;
-
import cn.huge.base.common.utils.ObjectUtils;
import cn.huge.module.cases.domain.dto.CaseInfoDTO;
+
+import cn.huge.module.cases.domain.dto.CaseInfoWeChatDTO;
+import cn.huge.module.cases.domain.dto.CasePersonWechatDTO;
import cn.huge.module.cases.domain.dto.RegisterSaveDTO;
import cn.huge.module.cases.domain.po.CaseAgent;
import cn.huge.module.cases.domain.po.CaseInfoUnfold;
@@ -17,6 +19,7 @@
import cn.huge.module.cases.dao.mapper.CaseInfoMapper;
import cn.huge.module.cases.domain.po.CaseInfo;
import cn.huge.module.constant.BaseConsts;
+import cn.huge.module.cust.dto.PaUserDTO;
import cn.huge.module.mediate.constant.CaseBaseConsts;
import cn.huge.module.mediate.constant.CaseBaseConstsEnum;
import cn.huge.module.cust.dto.CtUserDTO;
@@ -453,4 +456,259 @@
}
}
}
+
+ /**
+ * PC端-纠纷登记-保存纠纷信息-正常案件
+ * @param registerSaveDTO 纠纷信息
+ * @param userId 用户编号
+ * @return String 纠纷编号
+ */
+ public String caseRegisterWechat(RegisterSaveDTO registerSaveDTO, String userId){
+ try {
+ // 获取当前登录用户
+ PaUserDTO loginUser = custClient.paclientGetUser(userId);
+ if(ObjectUtils.isEmpty(registerSaveDTO.getCustId())){
+ registerSaveDTO.setCustId(loginUser.getCustId());
+ }
+
+ Date nowDate = DateUtils.getNowDate();
+ registerSaveDTO.setUpdateTime(nowDate);
+ StringBuffer plaintiffs = new StringBuffer();
+ StringBuffer defendants = new StringBuffer();
+ StringBuffer pagents = new StringBuffer();
+ StringBuffer dagents = new StringBuffer();
+ int peopleNum = 0;
+
+ CaseInfo caseInfo = new CaseInfo();
+ CaseInfoUnfold caseInfoUnfold = new CaseInfoUnfold();
+ BeanUtils.copyProperties(registerSaveDTO, caseInfo);
+ if(ObjectUtils.isEmpty(caseInfo.getId())){
+ caseInfo.setId(utilsClient.getNewTimeCaseId());
+ }
+// caseInfo.setInputUnitId(loginUser.getUnitId());
+// caseInfo.setInputUnitName(loginUser.getUnitName());
+ caseInfo.setInputUserId(loginUser.getId());
+ caseInfo.setInputUserName(loginUser.getTrueName());
+ caseInfo.setInputWay(CaseBaseConsts.INPUT_WAY_1);
+ caseInfo.setCreateTime(nowDate);
+ caseInfo.setUpdateTime(nowDate);
+ caseInfo.setDeleteStatus(BaseConsts.DELETE_STATUS_0);
+ //todo case_ref生成、case_title生成
+
+ caseInfoUnfold.setId(utilsClient.getNewTimeId());
+ caseInfoUnfold.setCaseId(caseInfo.getId());
+ caseInfoUnfold.setCreateTime(nowDate);
+ caseInfoUnfold.setUpdateTime(nowDate);
+
+ // 常规登记-保存当事人
+ peopleNum += this.saveCasePersonWechat(registerSaveDTO, plaintiffs, pagents, defendants, dagents,loginUser);
+ caseInfo.setPeopleNum(peopleNum);
+ caseInfo.setPlaintiffs(plaintiffs.toString());
+ caseInfo.setPagents(pagents.toString());
+ caseInfo.setDefendants(defendants.toString());
+ caseInfo.setDagents(dagents.toString());
+ //todo 流程接口修改status、status_name、process、process_name
+
+ this.saveOrUpdate(caseInfo);
+ return registerSaveDTO.getId();
+ }catch (Exception e){
+ log.error("service方法[CaseInfoService.caseRegisterWechat]调用异常:"+e, e);
+ throw new ServiceException("CaseInfoService.caseRegisterWechat", e);
+ }
+ }
+
+ /**
+ * pc端-常规登记-保存正式案件-保存人员信息
+ * @param registerSaveDTO 纠纷信息
+ * @param plaintiffs 申请人
+ * @param pagents 申请人代理人
+ * @param defendants 被申请人
+ * @param dagents 被申请人代理人
+ * @return int
+ */
+ private int saveCasePersonWechat(RegisterSaveDTO registerSaveDTO, StringBuffer plaintiffs, StringBuffer pagents,
+ StringBuffer defendants, StringBuffer dagents,PaUserDTO loginUser){
+ int peopleNum = 0;
+ List<String> newPersonIdList = new ArrayList<>();
+ List<String> newAgentIdList = new ArrayList<>();
+ // 保存申请人
+ List<CasePerson> personList = registerSaveDTO.getPersonList();
+ if (CollectionUtils.isNotEmpty(personList)) {
+ for (CasePerson casePerson : personList) {
+ if(ObjectUtils.isEmpty(casePerson.getId())){
+ casePerson.setId(utilsClient.getNewTimeCaseId());
+ }
+ newPersonIdList.add(casePerson.getId());
+ casePerson.setCaseId(registerSaveDTO.getId());
+// casePerson.setPerType(CaseBaseConstsEnum.PERSON_TYPE_1.getIndex());
+// casePerson.setPerTypeName(CaseBaseConstsEnum.PERSON_TYPE_1.getDes());
+ casePerson.setPartyUserId(loginUser.getId());
+ casePerson.setCustId(registerSaveDTO.getCustId());
+ casePerson.setCreateTime(registerSaveDTO.getUpdateTime());
+ casePerson.setUpdateTime(registerSaveDTO.getUpdateTime());
+ //todo 绑定当事人小程序
+
+ personService.saveOrUpdate(casePerson);
+
+ //添加申请方和被申请方人名组合
+ if(CaseBaseConstsEnum.PERSON_TYPE_1.equals(casePerson.getPerType())){
+ //申请方
+ if (StringUtils.isNotEmpty(plaintiffs.toString())) {
+ plaintiffs.append(BaseConsts.COMMA);
+ }
+ plaintiffs.append(casePerson.getTrueName());
+ }else if(CaseBaseConstsEnum.PERSON_TYPE_2.equals(casePerson.getPerType())){
+ //被申请方
+ if (StringUtils.isNotEmpty(defendants.toString())) {
+ defendants.append(BaseConsts.COMMA);
+ }
+ defendants.append(casePerson.getTrueName());
+ }
+ peopleNum++;
+
+ }
+ //保存代理人
+ List<CaseAgent> agentList = registerSaveDTO.getAgentList();
+ if (CollectionUtils.isNotEmpty(agentList)) {
+ for(CaseAgent caseAgent: agentList){
+ newAgentIdList.add(caseAgent.getId());
+ if(ObjectUtils.isEmpty(caseAgent.getId())){
+ caseAgent.setId(utilsClient.getNewTimeCaseId());
+ }
+ caseAgent.setPartyUserId(loginUser.getId());
+ caseAgent.setCaseId(registerSaveDTO.getId());
+ caseAgent.setAgentTypeName(CaseBaseConstsEnum.getDes(caseAgent.getAgentType()));
+
+ caseAgent.setCustId(registerSaveDTO.getCustId());
+ caseAgent.setCreateTime(registerSaveDTO.getUpdateTime());
+ caseAgent.setUpdateTime(registerSaveDTO.getUpdateTime());
+
+ agentService.saveOrUpdate(caseAgent);
+
+ if (StringUtils.isNotEmpty(pagents.toString())) {
+ pagents.append(BaseConsts.COMMA);
+ }
+ pagents.append(caseAgent.getTrueName());
+ }
+ //todo 绑定当事人小程序
+ }
+ }
+
+ // 删除冗余的申请人
+ if (CollectionUtils.isNotEmpty(newPersonIdList)) {
+ List<String> oldPersonIdList = personService.listIdByCaseId(registerSaveDTO.getId());
+ for (String oldPersonId : oldPersonIdList) {
+ if (!newPersonIdList.contains(oldPersonId)) {
+ personService.removeById(oldPersonId);
+ }
+ }
+ }else{
+ QueryWrapper<CasePerson> casePersonQueryWrapper = new QueryWrapper<>();
+ casePersonQueryWrapper.eq("case_id", registerSaveDTO.getId());
+ personService.remove(casePersonQueryWrapper);
+ }
+ //删除冗余的代理人
+ if(CollectionUtils.isNotEmpty(newAgentIdList)){
+ List<String> oldAgentIdList = agentService.listIdByCaseId(registerSaveDTO.getId());
+ for(String oldAgentId: oldAgentIdList){
+ if(!newAgentIdList.contains(oldAgentId)){
+ agentService.removeById(oldAgentId);
+ }
+ }
+ }else{
+ QueryWrapper<CaseAgent> caseAgentQueryWrapper = new QueryWrapper<>();
+ caseAgentQueryWrapper.eq("case_id", registerSaveDTO.getId());
+ agentService.remove(caseAgentQueryWrapper);
+ }
+
+ return peopleNum;
+ }
+
+ public RegisterSaveDTO getCaseInfoWechat(String id){
+ RegisterSaveDTO registerSaveDTO = new RegisterSaveDTO();
+ CaseInfo caseInfo = this.getById(id);
+ if(ObjectUtils.isNotEmpty(caseInfo)){
+ BeanUtils.copyProperties(caseInfo, registerSaveDTO);
+ }
+ QueryWrapper<CasePerson> casePersonQueryWrapper = new QueryWrapper<>();
+ casePersonQueryWrapper.eq("case_id", registerSaveDTO.getId());
+ List<CasePerson> personList = personService.list(casePersonQueryWrapper);
+ registerSaveDTO.setPersonList(personList);
+
+ QueryWrapper<CaseAgent> caseAgentQueryWrapper = new QueryWrapper<>();
+ caseAgentQueryWrapper.eq("case_id", registerSaveDTO.getId());
+ List<CaseAgent> agentList = agentService.list(caseAgentQueryWrapper);
+ registerSaveDTO.setAgentList(agentList);
+
+ return registerSaveDTO;
+ }
+
+ /**
+ * 按条件分页查询
+ * @param page 分页对象
+ * @param terms 条件
+ * @return Page
+ */
+ public Page<CaseInfoWeChatDTO> pageQueryWechat(String userId,PageRequest page, Map<String, Object> terms){
+ List<CaseInfoWeChatDTO> list = new ArrayList<>();
+ String personType = terms.get("personType")+"";
+ if(ObjectUtils.isEmpty(personType)){
+ throw new RuntimeException("请选择人员类型");
+ }
+ QueryWrapper<CasePerson> personWrapper = new QueryWrapper<>();
+ personWrapper.select("case_id");
+ personWrapper.eq("party_user_id", userId);
+ if("1".equals(personType)){
+ personWrapper.eq("per_type",CaseBaseConstsEnum.PERSON_TYPE_1.getIndex());
+ }else {
+ personWrapper.eq("per_type",CaseBaseConstsEnum.PERSON_TYPE_2.getIndex());
+ }
+ List<CasePerson> casePersonList = personService.list(personWrapper);
+ if(ObjectUtils.isEmpty(casePersonList)){
+ return new PageImpl<CaseInfoWeChatDTO>(list, page, 0);
+ }
+ List<String> ids = casePersonList.stream().map(CasePerson::getCaseId).collect(Collectors.toList());
+ terms.put("idList",ids);
+ long total = mapper.countTerms(terms);
+ List<CaseInfo> content = mapper.pageTerms(page, terms);
+ if(ObjectUtils.isNotEmpty(content)){
+ for(CaseInfo caseInfo: content){
+ CaseInfoWeChatDTO caseInfoWeChatDTO = new CaseInfoWeChatDTO();
+ BeanUtils.copyProperties(caseInfo, caseInfoWeChatDTO);
+ if(ObjectUtils.isNotEmpty(caseInfo.getProcess()) && caseInfo.getProcess().equals(1) || caseInfo.getProcess().equals(2)){
+ caseInfoWeChatDTO.setProcessStatus(1);
+ caseInfoWeChatDTO.setProcessStatusName("待受理");
+ }else if(ObjectUtils.isNotEmpty(caseInfo.getProcess()) && caseInfo.getProcess().equals(3) || caseInfo.getProcess().equals(4)){
+ caseInfoWeChatDTO.setProcessStatus(2);
+ caseInfoWeChatDTO.setProcessStatusName("办理中");
+ }else if(ObjectUtils.isNotEmpty(caseInfo.getProcess()) && caseInfo.getProcess().equals(5) || caseInfo.getProcess().equals(6)){
+ caseInfoWeChatDTO.setProcessStatus(3);
+ caseInfoWeChatDTO.setProcessStatusName("已结案");
+ }else{
+ caseInfoWeChatDTO.setProcessStatus(4);
+ caseInfoWeChatDTO.setProcessStatusName("不予受理");
+ }
+ QueryWrapper<CasePerson> personWrapper1 = new QueryWrapper<>();
+ personWrapper1.eq("case_id", caseInfo.getId());
+ List<CasePerson> casePersonList1 = personService.list(personWrapper1);
+ //申请人集合
+ List<CasePersonWechatDTO> plaintiffList = new ArrayList<>();
+ //被申请人集合
+ List<CasePersonWechatDTO> defendantList = new ArrayList<>();
+ for (CasePerson casePerson : casePersonList1) {
+ CasePersonWechatDTO casePersonWechatDTO = new CasePersonWechatDTO();
+ BeanUtils.copyProperties(casePerson, casePersonWechatDTO);
+ if(CaseBaseConstsEnum.PERSON_TYPE_1.getIndex().equals(casePerson.getPerType())){
+ plaintiffList.add(casePersonWechatDTO);
+ }else if(CaseBaseConstsEnum.PERSON_TYPE_2.getIndex().equals(casePerson.getPerType())){
+ defendantList.add(casePersonWechatDTO);
+ }
+ }
+ caseInfoWeChatDTO.setDefendantList(defendantList);
+ caseInfoWeChatDTO.setPlaintiffList(plaintiffList);
+ list.add(caseInfoWeChatDTO);
+ }
+ }
+ return new PageImpl<CaseInfoWeChatDTO>(list, page, total);
+ }
}
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/CustClient.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/CustClient.java
index 04fbe98..28ab532 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/CustClient.java
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/CustClient.java
@@ -46,6 +46,7 @@
@GetMapping("/api/client/paUser/clientGetUserAll")
ReturnBO paclientGetUser(@RequestParam("userId") String userId);
+
/**
* pc端提交案件后-获取相关当事人用户编号
* @url {ctx}/api/weChat/paUser/bindGetUserId
diff --git a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java
index da1fda0..1907587 100644
--- a/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java
+++ b/dyh-service/dyh-mediate/src/main/java/cn/huge/module/client/api/impl/CustClientImpl.java
@@ -86,6 +86,8 @@
}
}
+
+
/**
* 当事人-获取登录用户-所有信息
* @param userId 用户编号
diff --git a/dyh-service/dyh-sys/pom.xml b/dyh-service/dyh-sys/pom.xml
index 124dc92..daecefc 100644
--- a/dyh-service/dyh-sys/pom.xml
+++ b/dyh-service/dyh-sys/pom.xml
@@ -19,6 +19,8 @@
<properties>
<commons-net.version>3.1</commons-net.version>
+ <gson.version>2.8.5</gson.version>
+ <okhttp3.version>3.13.1</okhttp3.version>
</properties>
<dependencies>
@@ -67,6 +69,21 @@
<version>${commons-net.version}</version>
</dependency>
<!-- net end -->
+
+ <!-- gson -->
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <version>${gson.version}</version>
+ </dependency>
+ <!-- gson end -->
+
+ <dependency>
+ <groupId>com.squareup.okhttp3</groupId>
+ <artifactId>okhttp</artifactId>
+ <version>${okhttp3.version}</version>
+ </dependency>
+
</dependencies>
<build>
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java
index 6967199..d837fa1 100644
--- a/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/file/controller/wechat/FileInfoWechatController.java
@@ -18,7 +18,9 @@
import cn.huge.module.sys.constant.FileBaseConsts;
import cn.huge.module.sys.constant.FileOwnerTypeBaseEnum;
import cn.huge.module.sys.dto.FileInfoBaseDTO;
+import cn.huge.module.sys.dto.IdcardOcrResultDTO;
import cn.huge.module.utils.BaiduOcrUtils;
+import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
@@ -36,6 +38,7 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
/**
* @title: 附件信息表接口api-wechat端
@@ -198,7 +201,80 @@
}
}
+ /**
+ * ocr识别身份证
+ * @url {ctx}/api/wechat/fileInfo/wecatRecognition?ownerId=&ownerType=
+ * @param request
+ * @return Object
+ */
+ @PostMapping(value = "/wecatRecognition")
+ public Object wecatRecognition(MultipartHttpServletRequest request, @CurrentUser String userId){
+ try{
+ // todo 判断是小程序还是PC
+// UploaderDTO uploaderDTO = new UploaderDTO();
+// PaUserDTO paUserDTO = custClient.paClientGetUserAll(userId);
+// BeanUtils.copyProperties(paUserDTO, uploaderDTO);
+ Map<String , Object> result = Maps.newHashMap();
+ Iterator<String> itr = request.getFileNames();
+ while (itr.hasNext()) {
+ MultipartFile file = request.getFile(itr.next());
+// try{
+// String ownerId = request.getParameter("ownerId");
+// if (StringUtils.isNotEmpty(ownerId)) {
+// String ownerType = request.getParameter("ownerType");
+// int fileCount = fileRelateService.countByOwnerIdAndType(ownerId, ownerType)+1;
+// if(StringUtils.isEmpty(ownerType)){
+// ownerType = FileOwnerTypeBaseEnum.OWNER_TYPE_000.getIndex();
+// }
+// FileInfo fileInfo = service.wechatUploadFile(file, ownerId,ownerId, ownerType, fileCount, uploaderDTO);
+// FileInfoBaseDTO fileInfoBaseDTO = new FileInfoBaseDTO();
+// BeanUtils.copyProperties(fileInfo, fileInfoBaseDTO);
+// result.put("attachment", fileInfoBaseDTO);
+// }
+// }catch (Exception e){
+// log.error("Controller接口[FileInfoWechatController.wecatRecognition]请求异常:"+e, e);
+// }
+ try{
+ IdcardOcrResultDTO map = BaiduOcrUtils.ocrIdcard(file.getBytes());
+ result.put("ocrResult", map);
+ }catch (Exception e){
+ log.error("Controller接口[FileInfoWechatController.wecatRecognition]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo("OCR失败失败!");
+ }
+ }
+ return ReturnSucUtils.getRepInfo(result);
+ }catch (Exception e){
+ log.error("Controller接口[FileInfoWechatController.wecatRecognition]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo(e.getMessage());
+ }
+ }
-
+ /**
+ * ocr识别文字
+ * @url {ctx}/api/wechat/fileInfo/recognitionText
+ * @param request
+ * @return Object
+ */
+ @PostMapping(value = "/recognitionText")
+ public Object recognitionText(MultipartHttpServletRequest request){
+ try{
+ Map<String , Object> result = Maps.newHashMap();
+ Iterator<String> itr = request.getFileNames();
+ while (itr.hasNext()) {
+ MultipartFile file = request.getFile(itr.next());
+ try{
+ Map<String , Object> map = BaiduOcrUtils.ocrText(file.getBytes());
+ result.put("ocrResult", map);
+ }catch (Exception e){
+ log.error("Controller接口[FileInfoWechatController.recognitionText]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo("OCR失败!");
+ }
+ }
+ return ReturnSucUtils.getRepInfo("识别成功", result);
+ }catch (Exception e){
+ log.error("Controller接口[FileInfoWechatController.recognitionText]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo(e.getMessage());
+ }
+ }
}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/config/XfyunConfig.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/config/XfyunConfig.java
new file mode 100644
index 0000000..3cfa131
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/config/XfyunConfig.java
@@ -0,0 +1,81 @@
+package cn.huge.module.xfyun.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * @title: 科大讯飞工具类
+ * @description: 科大讯飞工具类
+ * @company: hugeinfo
+ * @author: liyj
+ * @time: 2021-11-05 16:51:48
+ * @version: 1.0.0
+ */
+@Component
+public class XfyunConfig {
+
+ /**
+ * hostUrl
+ */
+ public static String hostUrl;
+
+ /**
+ * appid
+ */
+ public static String appid;
+
+ /**
+ * apiSecret
+ */
+ public static String apiSecret;
+
+ /**
+ * apiKey
+ */
+ public static String apiKey;
+
+ @Value("${xfyun.host_url}")
+ public void setHostUrl(String host_url) {
+ hostUrl = host_url;
+ }
+
+ @Value("${xfyun.appid}")
+ public void setAppid(String app_id) {
+ appid = app_id;
+ }
+
+ @Value("${xfyun.api_secret}")
+ public void setApiSecret(String api_secret) {
+ apiSecret = api_secret;
+ }
+
+ @Value("${xfyun.api_key}")
+ public void setApiKey(String api_key) {
+ apiKey = api_key;
+ }
+
+
+}
+/**
+ * -------------------_ooOoo_-------------------
+ * ------------------o8888888o------------------
+ * ------------------88" . "88------------------
+ * ------------------(| -_- |)------------------
+ * ------------------O\ = /O------------------
+ * ---------------____/`---'\____---------------
+ * -------------.' \\| |// `.-------------
+ * ------------/ \\||| : |||// \------------
+ * -----------/ _||||| -:- |||||- \-----------
+ * -----------| | \\\ - /// | |-----------
+ * -----------| \_| ''\---/'' | |-----------
+ * -----------\ .-\__ `-` ___/-. /-----------
+ * ---------___`. .' /--.--\ `. . __----------
+ * ------."" '< `.___\_<|>_/___.' >'"".-------
+ * -----| | : `- \`.;`\ _ /`;.`/ - ` : | |-----
+ * -----\ \ `-. \_ __\ /__ _/ .-` / /-----
+ * ======`-.____`-.___\_____/___.-`____.-'======
+ * -------------------`=---='
+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ * ---------佛祖保佑---hugeinfo---永无BUG----------
+ */
\ No newline at end of file
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/controller/wechat/XfyunWechatController.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/controller/wechat/XfyunWechatController.java
new file mode 100644
index 0000000..fbfffbf
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/controller/wechat/XfyunWechatController.java
@@ -0,0 +1,66 @@
+package cn.huge.module.xfyun.controller.wechat;
+
+import cn.huge.base.common.utils.ReturnFailUtils;
+import cn.huge.base.common.utils.ReturnSucUtils;
+import cn.huge.module.constant.CacheConsts;
+import cn.huge.module.xfyun.config.XfyunConfig;
+import cn.huge.module.xfyun.iflytek.WebIATWS;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.WebSocket;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.concurrent.CountDownLatch;
+
+
+/**
+ * @title: 讯飞语音转文字api
+ * @description: 讯飞语音转文字api
+ * @company: hugeinfo
+ * @author: chenx
+ * @time: 2022-05-17 14:55:19
+ * @version: 1.0.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/wechat/xfyun")
+public class XfyunWechatController {
+
+ /**
+ * 讯飞语音转文字
+ * @url {ctx}/api/v1/xfyun/speech
+ * @return Object
+ */
+ @PostMapping(value = "/speech")
+ public Object speech(MultipartHttpServletRequest rq){
+ try{
+ Iterator<String> itr = rq.getFileNames();
+ while (itr.hasNext()) {
+ MultipartFile file = rq.getFile(itr.next());
+ byte [] byteArr = file.getBytes();
+ InputStream inputStream = new ByteArrayInputStream(byteArr);
+ // 构建鉴权url
+ String authUrl = WebIATWS.getAuthUrl(XfyunConfig.hostUrl, XfyunConfig.apiKey, XfyunConfig.apiSecret);
+ OkHttpClient client = new OkHttpClient.Builder().build();
+ String url = authUrl.toString().replace("http://", "ws://").replace("https://", "wss://");
+ Request request = new Request.Builder().url(url).build();
+ CountDownLatch countDownLatch = new CountDownLatch(1);
+ WebSocket webSocket = client.newWebSocket(request, new WebIATWS(inputStream, countDownLatch));
+ countDownLatch.await();
+ }
+ return ReturnSucUtils.getRepInfo(CacheConsts.XF_RESULT);
+ }catch (Exception e){
+ log.error("Controller接口[XfyunController.speech]请求异常:"+e, e);
+ return ReturnFailUtils.getRepInfo(e.getMessage());
+ }
+ }
+
+}
diff --git a/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/iflytek/WebIATWS.java b/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/iflytek/WebIATWS.java
new file mode 100644
index 0000000..374ccae
--- /dev/null
+++ b/dyh-service/dyh-sys/src/main/java/cn/huge/module/xfyun/iflytek/WebIATWS.java
@@ -0,0 +1,392 @@
+package cn.huge.module.xfyun.iflytek;
+
+import cn.huge.module.constant.CacheConsts;
+import cn.huge.module.xfyun.config.XfyunConfig;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * 语音听写流式 WebAPI 接口调用示例 接口文档(必看):https://doc.xfyun.cn/rest_api/语音听写(流式版).html
+ * webapi 听写服务参考帖子(必看):http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=38947&extra=
+ * 语音听写流式WebAPI 服务,热词使用方式:登陆开放平台https://www.xfyun.cn/后,找到控制台--我的应用---语音听写---个性化热词,上传热词
+ * 注意:热词只能在识别的时候会增加热词的识别权重,需要注意的是增加相应词条的识别率,但并不是绝对的,具体效果以您测试为准。
+ * 错误码链接:https://www.xfyun.cn/document/error-code (code返回错误码时必看)
+ * 语音听写流式WebAPI 服务,方言或小语种试用方法:登陆开放平台https://www.xfyun.cn/后,在控制台--语音听写(流式)--方言/语种处添加
+ * 添加后会显示该方言/语种的参数值
+ * @author iflytek
+ */
+@Slf4j
+public class WebIATWS extends WebSocketListener {
+ public static final int StatusFirstFrame = 0;
+ public static final int StatusContinueFrame = 1;
+ public static final int StatusLastFrame = 2;
+ private static InputStream inputStream;
+ private static CountDownLatch countDownLatch;
+ private static final SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss.SSS");
+ private static Date dateBegin = new Date();
+ private static Date dateEnd = new Date();
+ public static final Gson json = new Gson();
+ Decoder decoder = new Decoder();
+
+ /**
+ * 构造方法
+ * @param inputStream
+ * @param countDownLatch
+ */
+ public WebIATWS(InputStream inputStream, CountDownLatch countDownLatch) {
+ this.inputStream = inputStream;
+ this.countDownLatch = countDownLatch;
+ }
+
+ /**
+ * main方法
+ * @param args
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+
+ }
+
+ /**
+ * 发送语音
+ * @param webSocket
+ * @param response
+ */
+ @Override
+ public void onOpen(WebSocket webSocket, Response response) {
+ super.onOpen(webSocket, response);
+ new Thread(()->{
+ //连接成功,开始发送数据,每一帧音频的大小,建议每 40ms 发送 122B
+ int frameSize = 1280;
+ int intervel = 40;
+ // 音频的状态
+ int status = 0;
+ try {
+ byte[] buffer = new byte[frameSize];
+ // 发送音频
+ end:
+ while (true) {
+ int len = inputStream.read(buffer);
+ if (len == -1) {
+ //文件读完,改变status 为 2
+ status = StatusLastFrame;
+ }
+ switch (status) {
+ case StatusFirstFrame:
+ // 第一帧音频status = 0
+ JsonObject frame = new JsonObject();
+ //第一帧必须发送
+ JsonObject business = new JsonObject();
+ //第一帧必须发送
+ JsonObject common = new JsonObject();
+ //每一帧都要发送
+ JsonObject data = new JsonObject();
+ // 填充common
+ common.addProperty("app_id", XfyunConfig.appid);
+ //填充business
+ business.addProperty("language", "zh_cn");
+ business.addProperty("domain", "iat");
+ //中文方言请在控制台添加试用,添加后即展示相应参数值
+ business.addProperty("accent", "mandarin");
+ //动态修正(若未授权不生效,在控制台可免费开通)
+ business.addProperty("dwa", "wpgs");
+ //填充data
+ data.addProperty("status", StatusFirstFrame);
+ data.addProperty("format", "audio/L16;rate=16000");
+ data.addProperty("encoding", "raw");
+ data.addProperty("audio", Base64.getEncoder().encodeToString(Arrays.copyOf(buffer, len)));
+ //填充frame
+ frame.add("common", common);
+ frame.add("business", business);
+ frame.add("data", data);
+ webSocket.send(frame.toString());
+ // 发送完第一帧改变status 为 1
+ status = StatusContinueFrame;
+ break;
+ case StatusContinueFrame:
+ //中间帧status = 1
+ JsonObject frame1 = new JsonObject();
+ JsonObject data1 = new JsonObject();
+ data1.addProperty("status", StatusContinueFrame);
+ data1.addProperty("format", "audio/L16;rate=16000");
+ data1.addProperty("encoding", "raw");
+ data1.addProperty("audio", Base64.getEncoder().encodeToString(Arrays.copyOf(buffer, len)));
+ frame1.add("data", data1);
+ webSocket.send(frame1.toString());
+ break;
+ case StatusLastFrame:
+ // 最后一帧音频status = 2 ,标志音频发送结束
+ JsonObject frame2 = new JsonObject();
+ JsonObject data2 = new JsonObject();
+ data2.addProperty("status", StatusLastFrame);
+ data2.addProperty("audio", "");
+ data2.addProperty("format", "audio/L16;rate=16000");
+ data2.addProperty("encoding", "raw");
+ frame2.add("data", data2);
+ webSocket.send(frame2.toString());
+ System.out.println("sendlast");
+ break end;
+ }
+ //模拟音频采样延时
+ Thread.sleep(intervel);
+ }
+ System.out.println("all data is send");
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }).start();
+ }
+
+ /**
+ * 接收识别结果
+ * @param webSocket
+ * @param text
+ */
+ @Override
+ public void onMessage(WebSocket webSocket, String text) {
+ super.onMessage(webSocket, text);
+ ResponseData resp = json.fromJson(text, ResponseData.class);
+ if (resp != null) {
+ if (resp.getCode() != 0) {
+ log.error( "code=>" + resp.getCode() + " error=>" + resp.getMessage() + " sid=" + resp.getSid());
+ log.error( "错误码查询链接:https://www.xfyun.cn/document/error-code");
+ return;
+ }
+ if (resp.getData() != null) {
+ if (resp.getData().getResult() != null) {
+ Text te = resp.getData().getResult().getText();
+ try {
+ decoder.decode(te);
+ System.out.println("中间识别结果 ==》" + decoder.toString());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if (resp.getData().getStatus() == 2) {
+ // resp.data.status ==2 说明数据全部返回完毕,可以关闭连接,释放资源
+ System.out.println("session end ");
+ dateEnd = new Date();
+ System.out.println(sdf.format(dateBegin) + "开始");
+ System.out.println(sdf.format(dateEnd) + "结束");
+ log.info("耗时:" + (dateEnd.getTime() - dateBegin.getTime()) + "ms");
+ log.info("最终识别结果 ==》" + decoder.toString());
+ CacheConsts.XF_RESULT = decoder.toString();
+ System.out.println("本次识别sid ==》" + resp.getSid());
+ countDownLatch.countDown();
+ decoder.discard();
+ webSocket.close(1000, "");
+ } else {
+ System.out.println("识别中");
+ }
+ }
+ }
+ }
+
+ /**
+ * 失败结果
+ * @param webSocket
+ * @param t
+ * @param response
+ */
+ @Override
+ public void onFailure(WebSocket webSocket, Throwable t, Response response) {
+ super.onFailure(webSocket, t, response);
+ try {
+ if (null != response) {
+ int code = response.code();
+ System.out.println("onFailure code:" + code);
+ System.out.println("onFailure body:" + response.body().string());
+ if (101 != code) {
+ System.out.println("connection failed");
+ System.exit(0);
+ }
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 获取授权URL
+ * @param hostUrl
+ * @param apiKey
+ * @param apiSecret
+ * @return
+ * @throws Exception
+ */
+ public static String getAuthUrl(String hostUrl, String apiKey, String apiSecret) throws Exception {
+ URL url = new URL(hostUrl);
+ SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
+ format.setTimeZone(TimeZone.getTimeZone("GMT"));
+ String date = format.format(new Date());
+ StringBuilder builder = new StringBuilder("host: ").append(url.getHost()).append("\n").//
+ append("date: ").append(date).append("\n").//
+ append("GET ").append(url.getPath()).append(" HTTP/1.1");
+ Charset charset = Charset.forName("UTF-8");
+ Mac mac = Mac.getInstance("hmacsha256");
+ SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(charset), "hmacsha256");
+ mac.init(spec);
+ byte[] hexDigits = mac.doFinal(builder.toString().getBytes(charset));
+ String sha = Base64.getEncoder().encodeToString(hexDigits);
+
+ String authorization = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);
+ HttpUrl httpUrl = HttpUrl.parse("https://" + url.getHost() + url.getPath()).newBuilder().//
+ addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorization.getBytes(charset))).//
+ addQueryParameter("date", date).//
+ addQueryParameter("host", url.getHost()).//
+ build();
+ return httpUrl.toString();
+ }
+
+ /**
+ * 解析返回数据
+ */
+ public static class Decoder {
+ private Text[] texts;
+ private int defc = 10;
+ public Decoder() {
+ this.texts = new Text[this.defc];
+ }
+ public synchronized void decode(Text text) {
+ if (text.sn >= this.defc) {
+ this.resize();
+ }
+ if ("rpl".equals(text.pgs)) {
+ for (int i = text.rg[0]; i <= text.rg[1]; i++) {
+ this.texts[i].deleted = true;
+ }
+ }
+ this.texts[text.sn] = text;
+ }
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ for (Text t : this.texts) {
+ if (t != null && !t.deleted) {
+ sb.append(t.text);
+ }
+ }
+ return sb.toString();
+ }
+ public void resize() {
+ int oc = this.defc;
+ this.defc <<= 1;
+ Text[] old = this.texts;
+ this.texts = new Text[this.defc];
+ for (int i = 0; i < oc; i++) {
+ this.texts[i] = old[i];
+ }
+ }
+ public void discard(){
+ for(int i=0;i<this.texts.length;i++){
+ this.texts[i]= null;
+ }
+ }
+ }
+ public static class ResponseData {
+ private int code;
+ private String message;
+ private String sid;
+ private Data data;
+ public int getCode() {
+ return code;
+ }
+ public String getMessage() {
+ return this.message;
+ }
+ public String getSid() {
+ return sid;
+ }
+ public Data getData() {
+ return data;
+ }
+ }
+ public static class Data {
+ private int status;
+ private Result result;
+ public int getStatus() {
+ return status;
+ }
+ public Result getResult() {
+ return result;
+ }
+ }
+ public static class Result {
+ int bg;
+ int ed;
+ String pgs;
+ int[] rg;
+ int sn;
+ Ws[] ws;
+ boolean ls;
+ JsonObject vad;
+ public Text getText() {
+ Text text = new Text();
+ StringBuilder sb = new StringBuilder();
+ for (Ws ws : this.ws) {
+ sb.append(ws.cw[0].w);
+ }
+ text.sn = this.sn;
+ text.text = sb.toString();
+ text.sn = this.sn;
+ text.rg = this.rg;
+ text.pgs = this.pgs;
+ text.bg = this.bg;
+ text.ed = this.ed;
+ text.ls = this.ls;
+ text.vad = this.vad==null ? null : this.vad;
+ return text;
+ }
+ }
+ public static class Ws {
+ Cw[] cw;
+ int bg;
+ int ed;
+ }
+ public static class Cw {
+ int sc;
+ String w;
+ }
+ public static class Text {
+ int sn;
+ int bg;
+ int ed;
+ String text;
+ String pgs;
+ int[] rg;
+ boolean deleted;
+ boolean ls;
+ JsonObject vad;
+ @Override
+ public String toString() {
+ return "Text{" +
+ "bg=" + bg +
+ ", ed=" + ed +
+ ", ls=" + ls +
+ ", sn=" + sn +
+ ", text='" + text + '\'' +
+ ", pgs=" + pgs +
+ ", rg=" + Arrays.toString(rg) +
+ ", deleted=" + deleted +
+ ", vad=" + (vad==null ? "null" : vad.getAsJsonArray("ws").toString()) +
+ '}';
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.8.0