bobol
10 months ago
40 changed files with 456 additions and 1905 deletions
@ -0,0 +1,18 @@ |
|||
package com.lzbi.bill.domain; |
|||
|
|||
import com.alibaba.excel.metadata.data.CellData; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* 读取公式数据 |
|||
*/ |
|||
@Getter |
|||
@Setter |
|||
@EqualsAndHashCode |
|||
public class CellDataReadFormulaData { |
|||
private CellData<String> string; |
|||
} |
@ -0,0 +1,113 @@ |
|||
package com.lzbi.bill.listener; |
|||
|
|||
import cn.hutool.core.collection.CollectionUtil; |
|||
import cn.hutool.json.JSONArray; |
|||
import cn.hutool.json.JSONConfig; |
|||
import cn.hutool.json.JSONUtil; |
|||
import com.alibaba.excel.context.AnalysisContext; |
|||
import com.alibaba.excel.metadata.CellExtra; |
|||
import com.alibaba.excel.metadata.data.ReadCellData; |
|||
import com.alibaba.excel.read.listener.ReadListener; |
|||
import com.lzbi.draft.domain.vo.ProductionDailySheetVO; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* @author LWB |
|||
* @Description excel读取的监听器 |
|||
* 有个很重要的点 ExcelReadListener监听器 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 |
|||
* 所以,如果需要传入spring管理的对象,要么按照文档中的说明,直接使用构造器传参进来,要么使用ThreadLocal线程级别的变量工具传参 |
|||
* 实际应用中,可能会需要传入很多的spring管理的对象,或者其他上下文参数,遇到这种情况,建议使用ThreadLocal来传递参数,简单,便捷,无需重复修改构造器 |
|||
* 如果是简单的传递个别上下文参数,也可以选用构造器传参的方式 |
|||
*/ |
|||
@Slf4j |
|||
public class CellDataReadFormulaListener implements ReadListener<Map<Integer, String>> { |
|||
|
|||
/** |
|||
* excel所有的sheet-row-cell数据 |
|||
*/ |
|||
private List<ProductionDailySheetVO> list; |
|||
|
|||
/** |
|||
* 每个sheet页的所有行 |
|||
*/ |
|||
private List<List<String>> rows; |
|||
|
|||
/** |
|||
* sheet页的号 |
|||
*/ |
|||
private Integer sheetNo; |
|||
|
|||
/** |
|||
* 行的长度 |
|||
*/ |
|||
private Integer rowLength; |
|||
|
|||
public CellDataReadFormulaListener () { |
|||
this.list = new ArrayList<>(); |
|||
} |
|||
|
|||
public List<ProductionDailySheetVO> getList() { |
|||
return list; |
|||
} |
|||
|
|||
@Override |
|||
public void onException(Exception exception, AnalysisContext context) throws Exception { |
|||
ReadListener.super.onException(exception, context); |
|||
} |
|||
|
|||
@Override |
|||
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) { |
|||
ReadListener.super.invokeHead(headMap, context); |
|||
} |
|||
|
|||
@Override |
|||
public void invoke(Map<Integer, String> data, AnalysisContext context) { |
|||
if (null != data) { |
|||
List<String> cells = new ArrayList<>(); |
|||
data.forEach((k, v) -> { |
|||
if ("系统指标名称".equals(v)) { |
|||
rowLength = data.size(); |
|||
} |
|||
}); |
|||
if (null != rowLength) { |
|||
for (int i = 0; i < rowLength; i++) { |
|||
if (StringUtils.isNotBlank(data.get(i))) { |
|||
cells.add(data.get(i)); |
|||
} else { |
|||
cells.add(""); |
|||
} |
|||
} |
|||
this.rows.add(cells); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void extra(CellExtra extra, AnalysisContext context) { |
|||
ReadListener.super.extra(extra, context); |
|||
} |
|||
|
|||
@Override |
|||
public void doAfterAllAnalysed(AnalysisContext context) { |
|||
if (CollectionUtil.isNotEmpty(this.rows)) { |
|||
JSONArray data = JSONUtil.parseArray(JSONUtil.toJsonStr(this.rows)); |
|||
list.add(new ProductionDailySheetVO(context.readSheetHolder().getSheetNo(), context.readSheetHolder().getSheetName(), data)); |
|||
} |
|||
this.rows = null; |
|||
this.rowLength = null; |
|||
} |
|||
|
|||
@Override |
|||
public boolean hasNext(AnalysisContext context) { |
|||
if (!context.readSheetHolder().getSheetNo().equals(this.sheetNo)) { |
|||
this.sheetNo = context.readSheetHolder().getSheetNo(); |
|||
this.rows = new ArrayList<>(); |
|||
} |
|||
return ReadListener.super.hasNext(context); |
|||
} |
|||
} |
@ -1,97 +0,0 @@ |
|||
package com.lzbi.wechat.controller; |
|||
|
|||
import com.lzbi.common.core.domain.AjaxResult; |
|||
import com.lzbi.wechat.service.DeptService; |
|||
import com.lzbi.wechat.service.TargetService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.beans.factory.annotation.Qualifier; |
|||
import org.springframework.web.bind.annotation.GetMapping; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RequestParam; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
@RestController |
|||
@RequestMapping("/wechat/biz") |
|||
public class BizController { |
|||
|
|||
@Autowired |
|||
@Qualifier("wechatDeptService") |
|||
private DeptService deptService; |
|||
|
|||
@Autowired |
|||
private TargetService targetService; |
|||
|
|||
/** |
|||
* 获取自己所在部门 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/dept/self/list") |
|||
public AjaxResult getSelfDeptList() { |
|||
return AjaxResult.success(deptService.getSelfDeptList()); |
|||
} |
|||
|
|||
/** |
|||
* 获取下属部门列表 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/dept/children") |
|||
public AjaxResult getDeptChildren(@RequestParam("deptId") Long deptId) { |
|||
return AjaxResult.success(deptService.getDeptChildren(deptId)); |
|||
} |
|||
|
|||
/** |
|||
* 获取供热面积 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/heatRadiatingArea") |
|||
public AjaxResult getHeatRadiatingArea(@RequestParam("deptId") Long deptId, @RequestParam("date") String date) { |
|||
return AjaxResult.success(targetService.getHeatRadiatingArea(deptId, date)); |
|||
} |
|||
|
|||
/** |
|||
* 获取公司指标值 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/comany/target") |
|||
public AjaxResult getComanyTarget(@RequestParam("deptId") Long deptId, @RequestParam("date") String date) { |
|||
return AjaxResult.success(targetService.getComanyTarget(deptId, date)); |
|||
} |
|||
|
|||
/** |
|||
* 获取热源指标值 |
|||
* @param type 1、单日指标,2、累计指标 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/heatSource/target") |
|||
public AjaxResult getHeatSourceTarget(@RequestParam("deptId") Long deptId, @RequestParam("date") String date, @RequestParam("type") String type) { |
|||
return AjaxResult.success(targetService.getHeatSourceTarget(deptId, date, type)); |
|||
} |
|||
|
|||
/** |
|||
* 获取换热站参数 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/heatExchangeStation/params") |
|||
public AjaxResult getHeatExchangeStationParams(@RequestParam("deptId") Long deptId, @RequestParam("date") String date) { |
|||
return AjaxResult.success(targetService.getHeatExchangeStationParams(deptId)); |
|||
} |
|||
|
|||
/** |
|||
* 获取完成率 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/finishingRate") |
|||
public AjaxResult getFinishingRate(@RequestParam("deptId") Long deptId) { |
|||
return AjaxResult.success(targetService.getFinishingRate(deptId)); |
|||
} |
|||
|
|||
/** |
|||
* 获取完成率 |
|||
* @return |
|||
*/ |
|||
@GetMapping("/finishingRateLine") |
|||
public AjaxResult getFinishingRateLine(@RequestParam("deptId") Long deptId, @RequestParam("date") String date) { |
|||
return AjaxResult.success(targetService.finishingRateLine(deptId)); |
|||
} |
|||
|
|||
} |
@ -1,33 +0,0 @@ |
|||
package com.lzbi.wechat.controller; |
|||
|
|||
import com.lzbi.common.constant.Constants; |
|||
import com.lzbi.common.core.domain.AjaxResult; |
|||
import com.lzbi.common.core.domain.model.LoginBody; |
|||
import com.lzbi.wechat.service.LoginService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
@RestController |
|||
@RequestMapping("/wechat/biz/login") |
|||
public class LoginController { |
|||
|
|||
@Autowired |
|||
private LoginService loginService; |
|||
|
|||
/** |
|||
* 登录方法 |
|||
* |
|||
* @param loginBody 登录信息 |
|||
* @return 结果 |
|||
*/ |
|||
@PostMapping("/username") |
|||
public AjaxResult login(@RequestBody LoginBody loginBody) |
|||
{ |
|||
// 生成令牌
|
|||
return loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), |
|||
loginBody.getUuid()); |
|||
} |
|||
} |
@ -1,54 +0,0 @@ |
|||
package com.lzbi.wechat.controller; |
|||
|
|||
import com.lzbi.common.core.domain.AjaxResult; |
|||
import com.lzbi.wechat.domain.req.CodeLoginReq; |
|||
import com.lzbi.wechat.domain.req.PhoneNumberLoginReq; |
|||
import com.lzbi.wechat.domain.req.PhoneNumberReq; |
|||
import com.lzbi.wechat.service.WechatService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.validation.annotation.Validated; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
/** |
|||
* 微信服务相关接口控制器 |
|||
*/ |
|||
@RestController |
|||
@RequestMapping("/wechat/server") |
|||
public class WechatController { |
|||
|
|||
@Autowired |
|||
private WechatService wechatService; |
|||
|
|||
/** |
|||
* 登录凭证登录 |
|||
* @param codeLoginReq |
|||
* @return |
|||
*/ |
|||
@PostMapping("/codeLogin") |
|||
public AjaxResult codeLogin(@Validated @RequestBody CodeLoginReq codeLoginReq) { |
|||
return AjaxResult.success("操作成功", wechatService.codeLogin(codeLoginReq)); |
|||
} |
|||
|
|||
/** |
|||
* 获取手机号 |
|||
* @param phoneNumberReq |
|||
* @return |
|||
*/ |
|||
@PostMapping("/phoneNumber") |
|||
public AjaxResult getPhoneNumber(@Validated @RequestBody PhoneNumberReq phoneNumberReq) { |
|||
return AjaxResult.success("操作成功", wechatService.getPhoneNumber(phoneNumberReq)); |
|||
} |
|||
|
|||
/** |
|||
* 手机号登录 |
|||
* @param phoneNumberLoginReq |
|||
* @return |
|||
*/ |
|||
@PostMapping("/phoneNumberLogin") |
|||
public AjaxResult phoneNumberLogin(@Validated @RequestBody PhoneNumberLoginReq phoneNumberLoginReq) { |
|||
return AjaxResult.success("操作成功", wechatService.phoneNumberLogin(phoneNumberLoginReq)); |
|||
} |
|||
} |
@ -1,30 +0,0 @@ |
|||
package com.lzbi.wechat.domain; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 微信用户关系实体类 |
|||
*/ |
|||
@Data |
|||
public class SysWechat { |
|||
|
|||
/** |
|||
* id |
|||
*/ |
|||
private Long id; |
|||
/** |
|||
* 微信用户唯一标识 |
|||
*/ |
|||
private String openId; |
|||
/** |
|||
* 手机号 |
|||
*/ |
|||
private String phone; |
|||
|
|||
public SysWechat() {} |
|||
|
|||
public SysWechat(String openId, String phone) { |
|||
this.openId = openId; |
|||
this.phone = phone; |
|||
} |
|||
} |
@ -1,31 +0,0 @@ |
|||
package com.lzbi.wechat.domain.dto; |
|||
|
|||
import com.lzbi.wechat.domain.vo.TargetVO; |
|||
import lombok.Data; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
@Data |
|||
public class ParamsContrastDTO { |
|||
|
|||
/** |
|||
* 内部参数模板编码 |
|||
*/ |
|||
private String paramsModelCode; |
|||
/** |
|||
* 外部参数编码 |
|||
*/ |
|||
private String paramsCode; |
|||
/** |
|||
* 值 |
|||
*/ |
|||
private Double value; |
|||
|
|||
public static Map<String, ParamsContrastDTO> listTransitionMap(List<ParamsContrastDTO> list) { |
|||
Map<String, ParamsContrastDTO> map = new HashMap<>(); |
|||
list.forEach(obj -> map.put(obj.getParamsModelCode(), obj)); |
|||
return map; |
|||
} |
|||
} |
@ -1,37 +0,0 @@ |
|||
package com.lzbi.wechat.domain.dto; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 查询指标值 |
|||
*/ |
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class TargetModelValueDTO { |
|||
|
|||
/** |
|||
* 指标模板编码列表 |
|||
*/ |
|||
private List<String> targetModelCodeList; |
|||
/** |
|||
* 部门id |
|||
*/ |
|||
private Long deptId; |
|||
/** |
|||
* 年 |
|||
*/ |
|||
private String year; |
|||
/** |
|||
* 月 |
|||
*/ |
|||
private String month; |
|||
/** |
|||
* 日 |
|||
*/ |
|||
private String day; |
|||
} |
@ -1,18 +0,0 @@ |
|||
package com.lzbi.wechat.domain.req; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import javax.validation.constraints.NotBlank; |
|||
|
|||
/** |
|||
* 微信授权登录请求参数 |
|||
*/ |
|||
@Data |
|||
public class CodeLoginReq { |
|||
|
|||
/** |
|||
* 登录时获取的 code,可通过wx.login获取 |
|||
*/ |
|||
@NotBlank(message = "登录凭证不能为空") |
|||
private String code; |
|||
} |
@ -1,19 +0,0 @@ |
|||
package com.lzbi.wechat.domain.req; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 手机号登录请求参数 |
|||
*/ |
|||
@Data |
|||
public class PhoneNumberLoginReq { |
|||
|
|||
/** |
|||
* 手机号 |
|||
*/ |
|||
private String phone; |
|||
/** |
|||
* 微信用户唯一标识 |
|||
*/ |
|||
private String openId; |
|||
} |
@ -1,18 +0,0 @@ |
|||
package com.lzbi.wechat.domain.req; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import javax.validation.constraints.NotBlank; |
|||
|
|||
/** |
|||
* 获取手机号请求参数 |
|||
*/ |
|||
@Data |
|||
public class PhoneNumberReq { |
|||
|
|||
/** |
|||
* 手机号获取凭证 |
|||
*/ |
|||
@NotBlank(message = "手机号获取凭证不能为空") |
|||
private String code; |
|||
} |
@ -1,14 +0,0 @@ |
|||
package com.lzbi.wechat.domain.resp; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 获取接口调用凭据 |
|||
*/ |
|||
@Data |
|||
public class WechatAccessTokenResp extends WechatBaseResp { |
|||
|
|||
private String access_token; |
|||
|
|||
private Long expires_in; |
|||
} |
@ -1,19 +0,0 @@ |
|||
package com.lzbi.wechat.domain.resp; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 微信接口返回值 |
|||
*/ |
|||
@Data |
|||
public class WechatBaseResp { |
|||
|
|||
/** |
|||
* 错误码 |
|||
*/ |
|||
private Integer errcode; |
|||
/** |
|||
* 错误信息 |
|||
*/ |
|||
private String errmsg; |
|||
} |
@ -1,23 +0,0 @@ |
|||
package com.lzbi.wechat.domain.resp; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 微信登录凭证登录返回值 |
|||
*/ |
|||
@Data |
|||
public class WechatCodeLoginResp extends WechatBaseResp { |
|||
|
|||
/** |
|||
* 会话密钥 |
|||
*/ |
|||
private String session_key; |
|||
/** |
|||
* 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台账号下会返回 |
|||
*/ |
|||
private String unionid; |
|||
/** |
|||
* 用户唯一标识 |
|||
*/ |
|||
private String openid; |
|||
} |
@ -1,28 +0,0 @@ |
|||
package com.lzbi.wechat.domain.resp; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 获取手机号返回值 |
|||
*/ |
|||
@Data |
|||
public class WechatPhoneNumberResp extends WechatBaseResp { |
|||
|
|||
/** |
|||
* 手机号信息 |
|||
*/ |
|||
private PhoneInfo phone_info; |
|||
|
|||
/** |
|||
* 手机号信息 |
|||
*/ |
|||
@Data |
|||
public static class PhoneInfo { |
|||
|
|||
private String phoneNumber; |
|||
|
|||
private String purePhoneNumber; |
|||
|
|||
private String countryCode; |
|||
} |
|||
} |
@ -1,28 +0,0 @@ |
|||
package com.lzbi.wechat.domain.vo; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class ChildDeptVO { |
|||
|
|||
/** |
|||
* 部门id |
|||
*/ |
|||
private Object deptId; |
|||
/** |
|||
* 部门名称 |
|||
*/ |
|||
private String deptName; |
|||
/** |
|||
* 一次网供温 |
|||
*/ |
|||
private Double temperatureSupply; |
|||
/** |
|||
* 一次网回温 |
|||
*/ |
|||
private Double temperatureComeBack; |
|||
} |
@ -1,14 +0,0 @@ |
|||
package com.lzbi.wechat.domain.vo; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 登录凭证登录返回值 |
|||
*/ |
|||
@Data |
|||
public class CodeLoginVO { |
|||
|
|||
private String token; |
|||
|
|||
private String openId; |
|||
} |
@ -1,19 +0,0 @@ |
|||
package com.lzbi.wechat.domain.vo; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 部门返回值 |
|||
*/ |
|||
@Data |
|||
public class DeptVO { |
|||
|
|||
/** |
|||
* 部门id |
|||
*/ |
|||
private Long value; |
|||
/** |
|||
* 部门名称 |
|||
*/ |
|||
private String label; |
|||
} |
@ -1,22 +0,0 @@ |
|||
package com.lzbi.wechat.domain.vo; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
import java.util.List; |
|||
|
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class FinishingRateVO { |
|||
|
|||
/** |
|||
* 指标怕名称列表 |
|||
*/ |
|||
private List<String> names; |
|||
/** |
|||
* 指标值列表 |
|||
*/ |
|||
private List<Double> values; |
|||
} |
@ -1,25 +0,0 @@ |
|||
package com.lzbi.wechat.domain.vo; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
/** |
|||
* 指标返回值 |
|||
*/ |
|||
@EqualsAndHashCode(callSuper = true) |
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class TargetPlanVO extends TargetVO { |
|||
|
|||
/** |
|||
* 指标模板编码 |
|||
*/ |
|||
private String targetCode; |
|||
/** |
|||
* 值 |
|||
*/ |
|||
Double value; |
|||
} |
@ -1,36 +0,0 @@ |
|||
package com.lzbi.wechat.domain.vo; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
/** |
|||
* 指标返回值 |
|||
*/ |
|||
@EqualsAndHashCode(callSuper = true) |
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class TargetResultVO extends TargetVO { |
|||
|
|||
/** |
|||
* 指标名称 |
|||
*/ |
|||
private String targetName; |
|||
/** |
|||
* 指标单位 |
|||
*/ |
|||
private String targetUnit; |
|||
/** |
|||
* 值 |
|||
*/ |
|||
private Double value; |
|||
|
|||
public TargetResultVO (String targetCode, String targetName, String targetUnit, Double value) { |
|||
super(targetCode); |
|||
this.targetName = targetName; |
|||
this.targetUnit = targetUnit; |
|||
this.value = value; |
|||
} |
|||
} |
@ -1,16 +0,0 @@ |
|||
package com.lzbi.wechat.domain.vo; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class TargetVO { |
|||
|
|||
/** |
|||
* 指标模板编码 |
|||
*/ |
|||
private String targetCode; |
|||
} |
@ -1,45 +0,0 @@ |
|||
package com.lzbi.wechat.mapper; |
|||
|
|||
import com.lzbi.wechat.domain.SysWechat; |
|||
import org.apache.ibatis.annotations.Param; |
|||
|
|||
/** |
|||
* 微信用户关系数据访问层 |
|||
*/ |
|||
public interface SysWechatMapper { |
|||
|
|||
/** |
|||
* 查询微信用户关系 |
|||
* @param id |
|||
* @return |
|||
*/ |
|||
SysWechat selectSysWechatById(@Param("id") Long id); |
|||
|
|||
/** |
|||
* 查询微信用户关系 |
|||
* @param openId |
|||
* @return |
|||
*/ |
|||
SysWechat selectWechatByOpenId(@Param("openId") String openId); |
|||
|
|||
/** |
|||
* 增加微信用户关系 |
|||
* @param sysWechat |
|||
* @return |
|||
*/ |
|||
int insertSysWechat(SysWechat sysWechat); |
|||
|
|||
/** |
|||
* 修改微信用户关系 |
|||
* @param sysWechat |
|||
* @return |
|||
*/ |
|||
int updateSysWechat(SysWechat sysWechat); |
|||
|
|||
/** |
|||
* 删除微信用户关系 |
|||
* @param id |
|||
* @return |
|||
*/ |
|||
int deleteSysWechat(@Param("id") Long id); |
|||
} |
@ -1,139 +0,0 @@ |
|||
package com.lzbi.wechat.service; |
|||
|
|||
import com.lzbi.asset.domain.DcBaseAssetInfo; |
|||
import com.lzbi.asset.mapper.DcBaseAssetInfoMapper; |
|||
import com.lzbi.asset.mapper.DcBusiWorkReadConfigMapper; |
|||
import com.lzbi.common.config.IotServerApiConfig; |
|||
import com.lzbi.common.constant.BizConstants; |
|||
import com.lzbi.common.core.domain.entity.SysDept; |
|||
import com.lzbi.common.core.domain.entity.SysRole; |
|||
import com.lzbi.common.core.domain.entity.SysUser; |
|||
import com.lzbi.common.core.domain.model.LoginUser; |
|||
import com.lzbi.common.utils.SecurityUtils; |
|||
import com.lzbi.system.service.ISysDeptService; |
|||
import com.lzbi.wechat.domain.dto.ParamsContrastDTO; |
|||
import com.lzbi.wechat.domain.vo.ChildDeptVO; |
|||
import com.lzbi.wechat.domain.vo.DeptVO; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.util.CollectionUtils; |
|||
import org.springframework.web.client.RestTemplate; |
|||
|
|||
import javax.annotation.Resource; |
|||
import java.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.stream.Collectors; |
|||
|
|||
@Slf4j |
|||
@Service("wechatDeptService") |
|||
public class DeptService { |
|||
|
|||
@Autowired |
|||
private ISysDeptService sysDeptService; |
|||
|
|||
@Resource |
|||
private DcBaseAssetInfoMapper dcBaseAssetInfoMapper; |
|||
|
|||
@Resource |
|||
private DcBusiWorkReadConfigMapper dcBusiWorkReadConfigMapper; |
|||
|
|||
@Autowired |
|||
private RestTemplate restTemplate; |
|||
|
|||
@Autowired |
|||
private IotServerApiConfig iotServerApiConfig; |
|||
|
|||
public List<DeptVO> getSelfDeptList() { |
|||
List<DeptVO> list = new ArrayList<>(); |
|||
LoginUser loginUser = SecurityUtils.getLoginUser(); |
|||
SysUser sysUser = loginUser.getUser(); |
|||
List<SysRole> roles = sysUser.getRoles(); |
|||
List<Long> roleIds = roles.stream().map(SysRole::getRoleId).collect(Collectors.toList()); |
|||
List<SysDept> sysDepts = sysDeptService.selectDeptListByRoleIds(roleIds); |
|||
if (!CollectionUtils.isEmpty(sysDepts)) { |
|||
list = sysDepts.stream().filter(sysDept -> { |
|||
if (BizConstants.DcDeptAttr.COMANY.equals(sysDept.getOrgType())) { |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
}).map(sysDept -> { |
|||
DeptVO deptVO = new DeptVO(); |
|||
deptVO.setValue(sysDept.getDeptId()); |
|||
deptVO.setLabel(sysDept.getDeptName()); |
|||
return deptVO; |
|||
}).collect(Collectors.toList()); |
|||
} |
|||
return list; |
|||
} |
|||
|
|||
public List<ChildDeptVO> getDeptChildren(Long deptId) { |
|||
List<ChildDeptVO> list = new ArrayList<>(); |
|||
SysDept selfDept = sysDeptService.selectDeptById(deptId); |
|||
String orgType = selfDept.getOrgType(); |
|||
if (BizConstants.DcDeptAttr.COMANY.equals(orgType)) { |
|||
SysDept params = new SysDept(); |
|||
params.setParentId(deptId); |
|||
params.setOrgType(BizConstants.DcDeptAttr.HEAT_SOURCE); |
|||
List<SysDept> sysDeptList = sysDeptService.selectDeptList(params); |
|||
if (!CollectionUtils.isEmpty(sysDeptList)) { |
|||
list = sysDeptList.stream().map(item -> { |
|||
ChildDeptVO childDeptVO = new ChildDeptVO(); |
|||
childDeptVO.setDeptId(item.getDeptId()); |
|||
childDeptVO.setDeptName(item.getDeptName()); |
|||
childDeptVO.setTemperatureSupply(80D); |
|||
childDeptVO.setTemperatureComeBack(53D); |
|||
return childDeptVO; |
|||
}).collect(Collectors.toList()); |
|||
} |
|||
getHeatSourceParamsValue(deptId); |
|||
} else { |
|||
DcBaseAssetInfo params = new DcBaseAssetInfo(); |
|||
params.setOrgId(deptId); |
|||
params.setAssetLevel(BizConstants.DcAssetLevel.HEAT_EXCHANGE_STATION); |
|||
List<DcBaseAssetInfo> assetInfoList = dcBaseAssetInfoMapper.selectDcBaseAssetInfoList(params); |
|||
if (!CollectionUtils.isEmpty(assetInfoList)) { |
|||
list = assetInfoList.stream().map(item -> { |
|||
ChildDeptVO childDeptVO = new ChildDeptVO(); |
|||
childDeptVO.setDeptId(item.getAssetCode()); |
|||
childDeptVO.setDeptName(item.getAssetName()); |
|||
childDeptVO.setTemperatureSupply(80D); |
|||
childDeptVO.setTemperatureComeBack(53D); |
|||
return childDeptVO; |
|||
}).collect(Collectors.toList()); |
|||
} |
|||
} |
|||
return list; |
|||
} |
|||
|
|||
/** |
|||
* 查询热源参数值 |
|||
* @param deptId |
|||
* @return |
|||
*/ |
|||
public Map<Long, Map<String, Double>> getHeatSourceParamsValue (Long deptId) { |
|||
Long userId = SecurityUtils.getUserId(); |
|||
List<String> targetModelCodeList = new ArrayList<>(); |
|||
targetModelCodeList.add("101"); |
|||
targetModelCodeList.add("102"); |
|||
DcBaseAssetInfo assetParams = new DcBaseAssetInfo(); |
|||
assetParams.setOrgId(deptId); |
|||
assetParams.setAssetLevel(BizConstants.DcAssetLevel.HEAT_EXCHANGE_STATION); |
|||
assetParams.setAssetType(BizConstants.DcAssetType.REPORT); |
|||
List<ParamsContrastDTO> paramsContrastDTOList = dcBusiWorkReadConfigMapper.selectDcBusiWorkReadConfigByAssetTarget(targetModelCodeList, assetParams); |
|||
if (!CollectionUtils.isEmpty(paramsContrastDTOList)) { |
|||
List<String> paramsCodeList = paramsContrastDTOList.stream().map(ParamsContrastDTO::getParamsCode).collect(Collectors.toList()); |
|||
Map<Long, Map<Object, List<String>>> req = new HashMap<>(); |
|||
Map<Object, List<String>> deptMap = new HashMap<>(); |
|||
deptMap.put(deptId, paramsCodeList); |
|||
req.put(userId, deptMap); |
|||
String resp = restTemplate.postForObject(iotServerApiConfig.getParamsValue(), req, String.class); |
|||
log.info("参数值:{}", resp); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
} |
@ -1,181 +0,0 @@ |
|||
package com.lzbi.wechat.service; |
|||
|
|||
import com.lzbi.common.constant.CacheConstants; |
|||
import com.lzbi.common.constant.Constants; |
|||
import com.lzbi.common.constant.UserConstants; |
|||
import com.lzbi.common.core.domain.AjaxResult; |
|||
import com.lzbi.common.core.domain.entity.SysUser; |
|||
import com.lzbi.common.core.domain.model.LoginUser; |
|||
import com.lzbi.common.core.redis.RedisCache; |
|||
import com.lzbi.common.exception.ServiceException; |
|||
import com.lzbi.common.exception.user.*; |
|||
import com.lzbi.common.utils.DateUtils; |
|||
import com.lzbi.common.utils.MessageUtils; |
|||
import com.lzbi.common.utils.StringUtils; |
|||
import com.lzbi.common.utils.ip.IpUtils; |
|||
import com.lzbi.framework.manager.AsyncManager; |
|||
import com.lzbi.framework.manager.factory.AsyncFactory; |
|||
import com.lzbi.framework.security.context.AuthenticationContextHolder; |
|||
import com.lzbi.framework.web.service.TokenService; |
|||
import com.lzbi.system.service.ISysConfigService; |
|||
import com.lzbi.system.service.ISysUserService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.security.authentication.AuthenticationManager; |
|||
import org.springframework.security.authentication.BadCredentialsException; |
|||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
|||
import org.springframework.security.core.Authentication; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
@Service |
|||
public class LoginService { |
|||
|
|||
@Autowired |
|||
private TokenService tokenService; |
|||
|
|||
@Resource |
|||
private AuthenticationManager authenticationManager; |
|||
|
|||
@Autowired |
|||
private RedisCache redisCache; |
|||
|
|||
@Autowired |
|||
private ISysUserService userService; |
|||
|
|||
@Autowired |
|||
private ISysConfigService configService; |
|||
|
|||
/** |
|||
* 登录验证 |
|||
* |
|||
* @param username 用户名 |
|||
* @param password 密码 |
|||
* @param code 验证码 |
|||
* @param uuid 唯一标识 |
|||
* @return 结果 |
|||
*/ |
|||
public AjaxResult login(String username, String password, String code, String uuid) |
|||
{ |
|||
AjaxResult ajax = AjaxResult.success(); |
|||
// 验证码校验
|
|||
validateCaptcha(username, code, uuid); |
|||
// 登录前置校验
|
|||
loginPreCheck(username, password); |
|||
// 用户验证
|
|||
Authentication authentication = null; |
|||
try |
|||
{ |
|||
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); |
|||
AuthenticationContextHolder.setContext(authenticationToken); |
|||
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
|
|||
authentication = authenticationManager.authenticate(authenticationToken); |
|||
} |
|||
catch (Exception e) |
|||
{ |
|||
if (e instanceof BadCredentialsException) |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); |
|||
throw new UserPasswordNotMatchException(); |
|||
} |
|||
else |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); |
|||
throw new ServiceException(e.getMessage()); |
|||
} |
|||
} |
|||
finally |
|||
{ |
|||
AuthenticationContextHolder.clearContext(); |
|||
} |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); |
|||
LoginUser loginUser = (LoginUser) authentication.getPrincipal(); |
|||
SysUser user = loginUser.getUser(); |
|||
recordLoginInfo(loginUser.getUserId()); |
|||
// 生成token
|
|||
String token = tokenService.createToken(loginUser); |
|||
ajax.put(Constants.TOKEN, token); |
|||
ajax.put("nickName", user.getNickName()); |
|||
ajax.put("phone", user.getPhonenumber()); |
|||
return ajax; |
|||
} |
|||
|
|||
/** |
|||
* 校验验证码 |
|||
* |
|||
* @param username 用户名 |
|||
* @param code 验证码 |
|||
* @param uuid 唯一标识 |
|||
* @return 结果 |
|||
*/ |
|||
public void validateCaptcha(String username, String code, String uuid) |
|||
{ |
|||
boolean captchaEnabled = configService.selectCaptchaEnabled(); |
|||
if (captchaEnabled) |
|||
{ |
|||
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); |
|||
String captcha = redisCache.getCacheObject(verifyKey); |
|||
redisCache.deleteObject(verifyKey); |
|||
if (captcha == null) |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); |
|||
throw new CaptchaExpireException(); |
|||
} |
|||
if (!code.equalsIgnoreCase(captcha)) |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); |
|||
throw new CaptchaException(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 登录前置校验 |
|||
* @param username 用户名 |
|||
* @param password 用户密码 |
|||
*/ |
|||
public void loginPreCheck(String username, String password) |
|||
{ |
|||
// 用户名或密码为空 错误
|
|||
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); |
|||
throw new UserNotExistsException(); |
|||
} |
|||
// 密码如果不在指定范围内 错误
|
|||
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH |
|||
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH) |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); |
|||
throw new UserPasswordNotMatchException(); |
|||
} |
|||
// 用户名不在指定范围内 错误
|
|||
if (username.length() < UserConstants.USERNAME_MIN_LENGTH |
|||
|| username.length() > UserConstants.USERNAME_MAX_LENGTH) |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); |
|||
throw new UserPasswordNotMatchException(); |
|||
} |
|||
// IP黑名单校验
|
|||
String blackStr = configService.selectConfigByKey("sys.login.blackIPList"); |
|||
if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) |
|||
{ |
|||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked"))); |
|||
throw new BlackListException(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 记录登录信息 |
|||
* |
|||
* @param userId 用户ID |
|||
*/ |
|||
public void recordLoginInfo(Long userId) |
|||
{ |
|||
SysUser sysUser = new SysUser(); |
|||
sysUser.setUserId(userId); |
|||
sysUser.setLoginIp(IpUtils.getIpAddr()); |
|||
sysUser.setLoginDate(DateUtils.getNowDate()); |
|||
userService.updateUserProfile(sysUser); |
|||
} |
|||
} |
@ -1,62 +0,0 @@ |
|||
package com.lzbi.wechat.service; |
|||
|
|||
import com.lzbi.wechat.domain.SysWechat; |
|||
import com.lzbi.wechat.mapper.SysWechatMapper; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
/** |
|||
* 微信用户关系业务访问层 |
|||
*/ |
|||
@Service |
|||
public class SysWechatService { |
|||
|
|||
@Resource |
|||
private SysWechatMapper sysWechatMapper; |
|||
|
|||
/** |
|||
* 查询微信用户关系 |
|||
* @param id |
|||
* @return |
|||
*/ |
|||
public SysWechat selectWechatById(Long id) { |
|||
return sysWechatMapper.selectSysWechatById(id); |
|||
} |
|||
|
|||
/** |
|||
* 查询微信用户关系 |
|||
* @param openId |
|||
* @return |
|||
*/ |
|||
public SysWechat selectWechatByOpenId(String openId) { |
|||
return sysWechatMapper.selectWechatByOpenId(openId); |
|||
} |
|||
|
|||
/** |
|||
* 增加微信用户关系 |
|||
* @param sysWechat |
|||
* @return |
|||
*/ |
|||
public int insertWechat(SysWechat sysWechat) { |
|||
return sysWechatMapper.insertSysWechat(sysWechat); |
|||
} |
|||
|
|||
/** |
|||
* 修改微信用户关系 |
|||
* @param sysWechat |
|||
* @return |
|||
*/ |
|||
public int updateWechat(SysWechat sysWechat) { |
|||
return sysWechatMapper.updateSysWechat(sysWechat); |
|||
} |
|||
|
|||
/** |
|||
* 删除微信用户关系 |
|||
* @param id |
|||
* @return |
|||
*/ |
|||
public int deleteWechat(Long id) { |
|||
return sysWechatMapper.deleteSysWechat(id); |
|||
} |
|||
} |
@ -1,245 +0,0 @@ |
|||
package com.lzbi.wechat.service; |
|||
|
|||
import com.lzbi.asset.mapper.DcBaseAssetInfoMapper; |
|||
import com.lzbi.common.constant.BizConstants; |
|||
import com.lzbi.common.constant.TargetModelCodeConstants; |
|||
import com.lzbi.draft.mapper.DcBusiTargetDraftDaynewMapper; |
|||
import com.lzbi.draft.mapper.DcBusiTargetDraftMonthMapper; |
|||
import com.lzbi.system.service.ISysDeptService; |
|||
import com.lzbi.targetFolder.mapper.DcBaseAssetTargetMapper; |
|||
import com.lzbi.wechat.domain.dto.TargetModelValueDTO; |
|||
import com.lzbi.wechat.domain.vo.TargetPlanVO; |
|||
import com.lzbi.wechat.domain.vo.TargetResultVO; |
|||
import com.lzbi.wechat.domain.vo.TargetVO; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.util.CollectionUtils; |
|||
|
|||
import javax.annotation.Resource; |
|||
import java.text.DecimalFormat; |
|||
import java.util.*; |
|||
import java.util.stream.Collectors; |
|||
|
|||
@Service |
|||
public class TargetService { |
|||
|
|||
@Autowired |
|||
private ISysDeptService sysDeptService; |
|||
|
|||
@Resource |
|||
private DcBaseAssetInfoMapper dcBaseAssetInfoMapper; |
|||
|
|||
@Resource |
|||
private DcBaseAssetTargetMapper dcBaseAssetTargetMapper; |
|||
|
|||
@Resource |
|||
private DcBusiTargetDraftDaynewMapper dcBusiTargetDraftDaynewMapper; |
|||
|
|||
@Resource |
|||
private DcBusiTargetDraftMonthMapper dcBusiTargetDraftMonthMapper; |
|||
|
|||
private TargetModelValueDTO buildeTargetModelValueDTO(List<String> targetModelCodeList, Long deptId, String date) { |
|||
String year = null; |
|||
String month = null; |
|||
String day = null; |
|||
if (StringUtils.isNotBlank(date)) { |
|||
String[] arr = date.split("-"); |
|||
if (arr.length == 3) { |
|||
year = arr[0]; |
|||
month = arr[1]; |
|||
day = arr[2]; |
|||
} else { |
|||
throw new RuntimeException("日期格式不正确"); |
|||
} |
|||
} |
|||
return new TargetModelValueDTO(targetModelCodeList, deptId, year, month, day); |
|||
} |
|||
|
|||
public Double getHeatRadiatingArea(Long deptId, String date) { |
|||
List<String> targetModelCodeList = new ArrayList<>(); |
|||
targetModelCodeList.add(TargetModelCodeConstants.总开栓面积); |
|||
TargetModelValueDTO targetModelValueDTO = buildeTargetModelValueDTO(targetModelCodeList, deptId, date); |
|||
List<TargetResultVO> targetResultVOList = dcBusiTargetDraftDaynewMapper.selectDayTargetModelValue(targetModelValueDTO); |
|||
Double result = null; |
|||
if (!CollectionUtils.isEmpty(targetResultVOList)) { |
|||
result = targetResultVOList.get(0).getValue(); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
public Map<String, TargetResultVO> getComanyTarget(Long deptId, String date) { |
|||
List<String> targetModelCodeList = new ArrayList<>(); |
|||
targetModelCodeList.add(TargetModelCodeConstants.总产热量); |
|||
targetModelCodeList.add(TargetModelCodeConstants.一次网补水量); |
|||
targetModelCodeList.add(TargetModelCodeConstants.从大唐补一次网水量); |
|||
targetModelCodeList.add(TargetModelCodeConstants.总厂用电量); |
|||
targetModelCodeList.add(TargetModelCodeConstants.生产用标煤总量); |
|||
targetModelCodeList.add(TargetModelCodeConstants.热耗率); |
|||
TargetModelValueDTO targetModelValueDTO = buildeTargetModelValueDTO(targetModelCodeList, deptId, date); |
|||
List<TargetResultVO> targetResultVOList = dcBusiTargetDraftDaynewMapper.selectDayTargetModelValue(targetModelValueDTO); |
|||
Map<String, TargetResultVO> map = listTransitionMap(targetResultVOList); |
|||
TargetResultVO onceWater = map.get(TargetModelCodeConstants.一次网补水量); |
|||
TargetResultVO onceWater2 = map.get(TargetModelCodeConstants.从大唐补一次网水量); |
|||
if (null != onceWater.getValue() && null != onceWater2.getValue()) { |
|||
onceWater.setValue(onceWater.getValue() + onceWater2.getValue()); |
|||
} |
|||
map.remove(TargetModelCodeConstants.从大唐补一次网水量); |
|||
map.put(TargetModelCodeConstants.一次网补水量, onceWater); |
|||
return map; |
|||
} |
|||
|
|||
public Map<String, TargetResultVO> getHeatSourceTarget(Long deptId, String date, String type) { |
|||
List<String> targetModelCodeList = new ArrayList<>(); |
|||
targetModelCodeList.add(TargetModelCodeConstants.一次网补水量); // 一次网水耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.从大唐补一次网水量); // 一次网水耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.总厂用电量); // 一次网电耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.生产用标煤总量); // 一次网煤耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.总产热量); // 总产热量
|
|||
targetModelCodeList.add(TargetModelCodeConstants.汽炉产汽量); // 总产气量
|
|||
targetModelCodeList.add(TargetModelCodeConstants.发电量); // 总发电量
|
|||
targetModelCodeList.add(TargetModelCodeConstants.二次网耗水量); // 二次网总水耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.二次网耗电量); // 二次网总电耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.一次网供水温度); // 一次网供温
|
|||
targetModelCodeList.add(TargetModelCodeConstants.一次网回水温度); // 一次网回温
|
|||
targetModelCodeList.add(TargetModelCodeConstants.一次网耗水率); // 一次网水单耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.热源厂电耗率); // 一次网电单耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.单位面积耗标煤); // 一次网煤单耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.二次网耗水率); // 二次网水单耗
|
|||
targetModelCodeList.add(TargetModelCodeConstants.二次网耗电率); // 二次网电单耗
|
|||
TargetModelValueDTO targetModelValueDTO = buildeTargetModelValueDTO(targetModelCodeList, deptId, date); |
|||
Map<String, TargetResultVO> map; |
|||
if (BizConstants.TargetType.DAY.equals(type)) { |
|||
List<TargetResultVO> targetResultVOList = dcBusiTargetDraftDaynewMapper.selectDayTargetModelValue(targetModelValueDTO); |
|||
map = listTransitionMap(targetResultVOList); |
|||
} else { |
|||
List<TargetResultVO> targetResultVOList = dcBusiTargetDraftDaynewMapper.selectTotalTargetModelValue(targetModelValueDTO); |
|||
map = listTransitionMap(targetResultVOList); |
|||
} |
|||
TargetResultVO targetResultVO1 = map.get(TargetModelCodeConstants.一次网补水量); |
|||
TargetResultVO targetResultVO2 = map.get(TargetModelCodeConstants.从大唐补一次网水量); |
|||
if (null != targetResultVO1.getValue() && null != targetResultVO2.getValue()) { |
|||
targetResultVO1.setValue(targetResultVO1.getValue() + targetResultVO2.getValue()); |
|||
} else if (null == targetResultVO1.getValue() && null != targetResultVO2.getValue()) { |
|||
targetResultVO1.setValue(targetResultVO2.getValue()); |
|||
} |
|||
map.remove(TargetModelCodeConstants.从大唐补一次网水量); |
|||
return map; |
|||
} |
|||
|
|||
public Map<String, TargetResultVO> getHeatExchangeStationParams(Long deptId) { |
|||
Map<String, TargetResultVO> map = new HashMap<>(); |
|||
map.put("014", new TargetResultVO("014", "一次网回压", "Mpa", 14123123D)); |
|||
map.put("013", new TargetResultVO("013", "一次网供压", "Mpa", 2697D)); |
|||
map.put("011", new TargetResultVO("011", "一次网供温", "°C", 16791D)); |
|||
map.put("012", new TargetResultVO("012", "一次网回温", "°C", 11679D)); |
|||
map.put("007", new TargetResultVO("007", "瞬时流量", "m³/h", 8971D)); |
|||
map.put("008", new TargetResultVO("008", "瞬时热量", "kcal", 14123123D)); |
|||
map.put("009", new TargetResultVO("009", "累计热量", "kcal", 2697D)); |
|||
map.put("047", new TargetResultVO("047", "二次网供水压力", "Mpa", 16791D)); |
|||
map.put("048", new TargetResultVO("048", "二次网回水压力", "Mpa", 11679D)); |
|||
map.put("045", new TargetResultVO("045", "二次网供水温", "°C", 8971D)); |
|||
map.put("046", new TargetResultVO("046", "二次网回水温", "°C", 8971D)); |
|||
map.put("001", new TargetResultVO("001", "电调阀开度给定", "%", 14123123D)); |
|||
map.put("002", new TargetResultVO("002", "电调阀开度反馈", "%", 2697D)); |
|||
map.put("015", new TargetResultVO("015", "水箱水位计", "GJ", 16791D)); |
|||
map.put("004", new TargetResultVO("004", "电调阀控制模式选择", "GJ", 11679D)); |
|||
map.put("003", new TargetResultVO("003", "电调阀远控/就地", "°C", 8971D)); |
|||
map.put("044", new TargetResultVO("044", "二次网压差设定", "%", 14123123D)); |
|||
map.put("019", new TargetResultVO("019", "一次网管道泵上电", "", 2697D)); |
|||
map.put("020", new TargetResultVO("020", "一次网管道泵下电", "", 16791D)); |
|||
map.put("005", new TargetResultVO("005", "二次网供温设定", "", 16791D)); |
|||
map.put("018", new TargetResultVO("018", "一次网管道泵远控/就地", "", 16791D)); |
|||
map.put("021", new TargetResultVO("021", "一次网管道泵启动", "", 16791D)); |
|||
map.put("010", new TargetResultVO("010", "热量累计清零", "kwh", 16791D)); |
|||
map.put("017", new TargetResultVO("017", "总电表", "°C", 16791D)); |
|||
map.put("006", new TargetResultVO("006", "二次网供回水平均温设定", "m³", 16791D)); |
|||
map.put("031", new TargetResultVO("031", "水表(累计补水量)", "%", 16791D)); |
|||
map.put("023", new TargetResultVO("023", "一次网管道泵频率给定", "%", 16791D)); |
|||
map.put("028", new TargetResultVO("028", "一次网混水电调阀开度给定", "%", 16791D)); |
|||
map.put("029", new TargetResultVO("029", "一次网混水电调阀开度反馈", "", 16791D)); |
|||
map.put("035", new TargetResultVO("035", "补水泵1#故障状态", "m³", 16791D)); |
|||
map.put("032", new TargetResultVO("032", "水表(累计补水量清零)", "", 16791D)); |
|||
map.put("036", new TargetResultVO("036", "补水泵2#故障状态", "", 16791D)); |
|||
map.put("037", new TargetResultVO("037", "循环泵远控/就地选择", "", 16791D)); |
|||
map.put("038", new TargetResultVO("038", "循环泵1#/2#泵选择", "", 16791D)); |
|||
map.put("039", new TargetResultVO("039", "循环泵控制模式选择", "", 16791D)); |
|||
map.put("025", new TargetResultVO("025", "一次网管道泵运行/停止状态", "", 16791D)); |
|||
map.put("026", new TargetResultVO("026", "一次网管道泵故障状态", "", 16791D)); |
|||
map.put("027", new TargetResultVO("027", "一次网混水电调阀远控/就地", "", 16791D)); |
|||
map.put("033", new TargetResultVO("033", "补水泵1#运行/停止状态", "", 16791D)); |
|||
map.put("034", new TargetResultVO("034", "补水泵2#运行/停止状态", "", 16791D)); |
|||
map.put("040", new TargetResultVO("040", "循环泵变频上电", "", 16791D)); |
|||
map.put("041", new TargetResultVO("041", "循环泵变频下电", "", 16791D)); |
|||
map.put("042", new TargetResultVO("042", "循环泵变频启动", "", 16791D)); |
|||
map.put("043", new TargetResultVO("043", "循环泵变频停止", "", 16791D)); |
|||
map.put("022", new TargetResultVO("022", "一次网管道泵停止", "", 16791D)); |
|||
map.put("030", new TargetResultVO("030", "水表(瞬时补水量)", "m³", 16791D)); |
|||
map.put("066", new TargetResultVO("066", "一次网管道泵启/停", "", 16791D)); |
|||
map.put("024", new TargetResultVO("024", "一次网管道泵频率反馈", "", 16791D)); |
|||
return map; |
|||
} |
|||
|
|||
public List<List<Object>> getFinishingRate(Long deptId) { |
|||
List<List<Object>> list = new ArrayList<>(); |
|||
List<String> targetModelCodeList = new ArrayList<>(); |
|||
targetModelCodeList.add(TargetModelCodeConstants.一次网耗水率); |
|||
targetModelCodeList.add(TargetModelCodeConstants.二次网耗水率); |
|||
targetModelCodeList.add(TargetModelCodeConstants.热源厂电耗率); |
|||
targetModelCodeList.add(TargetModelCodeConstants.二次网耗电率); |
|||
targetModelCodeList.add(TargetModelCodeConstants.单位面积耗标煤); |
|||
TargetModelValueDTO targetModelValueDTO = buildeTargetModelValueDTO(targetModelCodeList, deptId, null); |
|||
List<TargetResultVO> targetResultVOList = dcBusiTargetDraftDaynewMapper.selectTotalTargetModelValue(targetModelValueDTO); |
|||
List<TargetPlanVO> targetPlanVOList = dcBusiTargetDraftMonthMapper.selectTotalTargetModelPlanValue(targetModelValueDTO); |
|||
Map<String, TargetResultVO> targetValueMap = null; |
|||
Map<String, Double> targetPlanValueMap = null; |
|||
if (!CollectionUtils.isEmpty(targetResultVOList)) { |
|||
targetValueMap = listTransitionMap(targetResultVOList); |
|||
} |
|||
if (!CollectionUtils.isEmpty(targetPlanVOList)) { |
|||
targetPlanValueMap = targetPlanVOList.stream().collect(Collectors.toMap(TargetPlanVO::getTargetCode, TargetPlanVO::getValue)); |
|||
} |
|||
if (null == targetValueMap || null == targetPlanValueMap) { |
|||
throw new RuntimeException("无数据"); |
|||
} |
|||
List<Object> names = new ArrayList<>(); |
|||
names.add("name"); |
|||
List<Object> values = new ArrayList<>(); |
|||
values.add("总完成率"); |
|||
DecimalFormat decimalFormat = new DecimalFormat("#0.00"); |
|||
for (String targetModelCode : targetModelCodeList) { |
|||
TargetResultVO targetResultVO = targetValueMap.get(targetModelCode); |
|||
Double value = targetResultVO.getValue(); |
|||
Double planValue = targetPlanValueMap.get(targetModelCode); |
|||
if (null == planValue) { |
|||
continue; |
|||
} |
|||
names.add(targetResultVO.getTargetName()); |
|||
values.add(decimalFormat.format((value / planValue) * 100)); |
|||
} |
|||
list.add(names); |
|||
list.add(values); |
|||
return list; |
|||
} |
|||
|
|||
public List<List<Object>> finishingRateLine(Long deptId) { |
|||
List<List<Object>> list = new ArrayList<>(); |
|||
List<Object> list1 = Arrays.asList("product", "2012", "2013", "2014", "2015", "2016", "2017"); |
|||
List<Object> list2 = Arrays.asList("Milk Tea", 56.5, 82.1, 88.7, 70.1, 53.4, 85.1); |
|||
List<Object> list3 = Arrays.asList("Matcha Latte", 51.1, 51.4, 55.1, 53.3, 73.8, 68.7); |
|||
List<Object> list4 = Arrays.asList("Cheese Cocoa", 40.1, 62.2, 69.5, 36.4, 45.2, 32.5); |
|||
List<Object> list5 = Arrays.asList("Walnut Brownie", 25.2, 37.1, 41.2, 18, 33.9, 49.1); |
|||
list.add(list1); |
|||
list.add(list2); |
|||
list.add(list3); |
|||
list.add(list4); |
|||
list.add(list5); |
|||
return list; |
|||
} |
|||
|
|||
private <T extends TargetVO> Map<String, T> listTransitionMap(List<T> list) { |
|||
Map<String, T> map = new HashMap<>(); |
|||
list.forEach(obj -> map.put(obj.getTargetCode(), obj)); |
|||
return map; |
|||
} |
|||
} |
@ -1,161 +0,0 @@ |
|||
package com.lzbi.wechat.service; |
|||
|
|||
import com.alibaba.fastjson2.JSONObject; |
|||
import com.lzbi.common.config.WechatConfig; |
|||
import com.lzbi.common.core.domain.entity.SysUser; |
|||
import com.lzbi.common.core.domain.model.LoginUser; |
|||
import com.lzbi.common.exception.ServiceException; |
|||
import com.lzbi.framework.web.service.SysLoginService; |
|||
import com.lzbi.framework.web.service.SysPermissionService; |
|||
import com.lzbi.framework.web.service.TokenService; |
|||
import com.lzbi.system.service.ISysUserService; |
|||
import com.lzbi.wechat.domain.SysWechat; |
|||
import com.lzbi.wechat.domain.resp.WechatAccessTokenResp; |
|||
import com.lzbi.wechat.domain.resp.WechatCodeLoginResp; |
|||
import com.lzbi.wechat.domain.resp.WechatPhoneNumberResp; |
|||
import com.lzbi.wechat.domain.req.CodeLoginReq; |
|||
import com.lzbi.wechat.domain.req.PhoneNumberLoginReq; |
|||
import com.lzbi.wechat.domain.req.PhoneNumberReq; |
|||
import com.lzbi.wechat.domain.vo.CodeLoginVO; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.apache.commons.lang3.ObjectUtils; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.http.HttpEntity; |
|||
import org.springframework.http.HttpHeaders; |
|||
import org.springframework.http.MediaType; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.transaction.annotation.Transactional; |
|||
import org.springframework.web.client.RestTemplate; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* 微信服务业务逻辑层 |
|||
*/ |
|||
@Slf4j |
|||
@Service |
|||
public class WechatService { |
|||
|
|||
@Autowired |
|||
private WechatConfig wechatConfig; |
|||
|
|||
@Autowired |
|||
private RestTemplate restTemplate; |
|||
|
|||
@Autowired |
|||
private SysWechatService sysWechatService; |
|||
|
|||
@Autowired |
|||
private ISysUserService sysUserService; |
|||
|
|||
@Autowired |
|||
private SysLoginService sysLoginService; |
|||
|
|||
@Autowired |
|||
private TokenService tokenService; |
|||
|
|||
@Autowired |
|||
private SysPermissionService permissionService; |
|||
|
|||
/** |
|||
* 登录凭证登录 |
|||
* |
|||
* @param codeLoginReq |
|||
* @return |
|||
*/ |
|||
public CodeLoginVO codeLogin(CodeLoginReq codeLoginReq) { |
|||
CodeLoginVO codeLoginVO = new CodeLoginVO(); |
|||
// 微信登录凭证登录请求,获取到open_id
|
|||
Map<String, Object> params = new HashMap<>(); |
|||
params.put("appid", wechatConfig.getAppId()); |
|||
params.put("secret", wechatConfig.getAppSecret()); |
|||
params.put("js_code", codeLoginReq.getCode()); |
|||
params.put("grant_type", "authorization_code"); |
|||
WechatCodeLoginResp resp = restTemplate.getForObject(wechatConfig.getCode2Session(), WechatCodeLoginResp.class, params); |
|||
if (ObjectUtils.isNotEmpty(resp) && 0L == resp.getErrcode()) { |
|||
String openid = resp.getOpenid(); |
|||
codeLoginVO.setOpenId(openid); |
|||
// 根据open_id到数据库中查询sysWechat信息
|
|||
SysWechat sysWechat = sysWechatService.selectWechatByOpenId(openid); |
|||
// 查询到了的话,执行登录操作,返回token
|
|||
if (ObjectUtils.isNotEmpty(sysWechat)) { |
|||
SysUser sysUser = sysUserService.selectUserByPhonenumber(sysWechat.getPhone()); |
|||
if (ObjectUtils.isNotEmpty(sysUser)) { |
|||
String token = this.getToken(sysUser); |
|||
codeLoginVO.setToken(token); |
|||
} |
|||
} |
|||
} else { |
|||
log.error("调用微信服务小程序登录接口时失败,{}, {}", resp.getErrcode(), resp.getErrmsg()); |
|||
throw new ServiceException(resp.getErrmsg(), resp.getErrcode()); |
|||
} |
|||
return codeLoginVO; |
|||
} |
|||
|
|||
@Transactional(rollbackFor = Exception.class) |
|||
public String phoneNumberLogin(PhoneNumberLoginReq phoneNumberLoginReq) { |
|||
// 微信和用户信息绑定
|
|||
SysWechat sysWechat = new SysWechat(phoneNumberLoginReq.getOpenId(), phoneNumberLoginReq.getPhone()); |
|||
int i = sysWechatService.insertWechat(sysWechat); |
|||
if (i > 0) { |
|||
// 获取token
|
|||
SysUser sysUser = sysUserService.selectUserByPhonenumber(sysWechat.getPhone()); |
|||
if (ObjectUtils.isNotEmpty(sysUser)) { |
|||
return this.getToken(sysUser); |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/** |
|||
* 获取手机号 |
|||
* @param phoneNumberReq |
|||
* @return |
|||
*/ |
|||
public String getPhoneNumber(PhoneNumberReq phoneNumberReq) { |
|||
// 获取接口调用凭据
|
|||
Map<String, Object> getAccessTokenParams = new HashMap<>(); |
|||
getAccessTokenParams.put("appid", wechatConfig.getAppId()); |
|||
getAccessTokenParams.put("secret", wechatConfig.getAppSecret()); |
|||
getAccessTokenParams.put("grant_type", "client_credential"); |
|||
WechatAccessTokenResp wechatAccessTokenResp = restTemplate.getForObject(wechatConfig.getAccessToken(), WechatAccessTokenResp.class, getAccessTokenParams); |
|||
if (ObjectUtils.isNotEmpty(wechatAccessTokenResp) && null == wechatAccessTokenResp.getErrcode()) { |
|||
// 获取手机号
|
|||
String accessToken = wechatAccessTokenResp.getAccess_token(); |
|||
Map<String, Object> getPhoneNumberParams = new HashMap<>(); |
|||
getPhoneNumberParams.put("access_token", accessToken); |
|||
HttpHeaders headers = new HttpHeaders(); |
|||
headers.setContentType(MediaType.APPLICATION_JSON); |
|||
Map<String, Object> getPhoneNumberBody = new HashMap<>(); |
|||
getPhoneNumberBody.put("code", phoneNumberReq.getCode()); |
|||
HttpEntity<String> entity = new HttpEntity<>(JSONObject.toJSONString(getPhoneNumberBody), headers); |
|||
WechatPhoneNumberResp resp = restTemplate.postForObject(wechatConfig.getPhoneNumber(), entity, WechatPhoneNumberResp.class, getPhoneNumberParams); |
|||
if (ObjectUtils.isNotEmpty(resp) && 0L == resp.getErrcode()) { |
|||
if (null != resp.getPhone_info()) { |
|||
return resp.getPhone_info().getPurePhoneNumber(); |
|||
} |
|||
} else { |
|||
log.error("调用微信服务获取手机号接口时失败,{}, {}", resp.getErrcode(), resp.getErrmsg()); |
|||
throw new ServiceException(resp.getErrmsg(), resp.getErrcode()); |
|||
} |
|||
} else { |
|||
log.error("调用微信服务获取access_token接口时失败,{}, {}", wechatAccessTokenResp.getErrcode(), wechatAccessTokenResp.getErrmsg()); |
|||
throw new ServiceException(wechatAccessTokenResp.getErrmsg(), wechatAccessTokenResp.getErrcode()); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/** |
|||
* 获取token |
|||
* @param sysUser |
|||
* @return |
|||
*/ |
|||
private String getToken(SysUser sysUser) { |
|||
LoginUser loginUser = new LoginUser(sysUser.getUserId(), sysUser.getDeptId(), sysUser, permissionService.getMenuPermission(sysUser)); |
|||
sysLoginService.recordLoginInfo(loginUser.getUserId()); |
|||
// 生成token
|
|||
return tokenService.createToken(loginUser); |
|||
} |
|||
|
|||
} |
@ -1,149 +0,0 @@ |
|||
package com.lzbi.wechat.webSocket; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import javax.websocket.*; |
|||
import javax.websocket.server.PathParam; |
|||
import javax.websocket.server.ServerEndpoint; |
|||
import java.io.IOException; |
|||
import java.util.Map; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
import java.util.concurrent.atomic.AtomicInteger; |
|||
|
|||
/** |
|||
* @ClassName HeatSourceServer |
|||
* @Description 热源列表服务 |
|||
* @Author lienbo |
|||
* @Date 2024/01/25 16:06 |
|||
* @Version V1.0 |
|||
*/ |
|||
@Component |
|||
@Slf4j |
|||
@ServerEndpoint("/ws/heatSourceList/{userId}/{deptId}") |
|||
public class HeatSourceServer { |
|||
|
|||
/** |
|||
* 静态变量,用来记录当前在线连接数,线程安全的类。 |
|||
*/ |
|||
private static AtomicInteger onlineSessionClientCount = new AtomicInteger(0); |
|||
|
|||
/** |
|||
* 存放所有在线的客户端 |
|||
*/ |
|||
private static Map<Long, Session> onlineSessionClientMap = new ConcurrentHashMap<>(); |
|||
|
|||
/** |
|||
* 存放所有在线的用户和要查询的组织id |
|||
*/ |
|||
private static Map<Long, Long> onlineUserDeptMap = new ConcurrentHashMap<>(); |
|||
|
|||
/** |
|||
* 连接建立成功调用的方法。由前端<code>new WebSocket</code>触发 |
|||
* |
|||
* @param userId 每次页面建立连接时传入到服务端的id,比如用户id等。可以自定义。 |
|||
* @param deptId 公司ID |
|||
* @param session 与某个客户端的连接会话,需要通过它来给客户端发送消息 |
|||
*/ |
|||
@OnOpen |
|||
public void onOpen(@PathParam("userId") Long userId, @PathParam("deptId") Long deptId, Session session) { |
|||
log.info("连接建立中 ==> session_id = {},userId = {},deptId = {}", session.getId(), userId, deptId); |
|||
onlineUserDeptMap.put(userId, deptId); |
|||
onlineSessionClientMap.put(userId, session); |
|||
//在线数加1
|
|||
onlineSessionClientCount.incrementAndGet(); |
|||
sendToOne(userId, "hello " + userId + " 您已连接成功"); |
|||
log.info("连接建立成功,当前在线数为:{} ==> 开始监听新连接:session_id = {}, sid = {},。", onlineSessionClientCount, session.getId(), userId); |
|||
} |
|||
|
|||
/** |
|||
* 连接关闭调用的方法。由前端<code>socket.close()</code>触发 |
|||
* |
|||
* @param userId |
|||
* @param session |
|||
*/ |
|||
@OnClose |
|||
public void onClose(@PathParam("userId") Long userId, Session session) { |
|||
// 从 Map中移除
|
|||
onlineSessionClientMap.remove(userId); |
|||
//在线数减1
|
|||
onlineSessionClientCount.decrementAndGet(); |
|||
log.info("连接关闭成功,当前在线数为:{} ==> 关闭该连接信息:session_id = {}, userId = {},。", onlineSessionClientCount, session.getId(), userId); |
|||
} |
|||
|
|||
/** |
|||
* 收到客户端消息后调用的方法。由前端<code>socket.send</code>触发 |
|||
* * 当服务端执行toSession.getAsyncRemote().sendText(xxx)后,前端的socket.onmessage得到监听。 |
|||
* |
|||
* @param message |
|||
* @param session |
|||
*/ |
|||
@OnMessage |
|||
public void onMessage(String message, Session session) throws IOException { |
|||
log.info("服务端收到客户端消息 ==>, message = {}", message); |
|||
session.getBasicRemote().sendText(message); |
|||
} |
|||
|
|||
/** |
|||
* 发生错误调用的方法 |
|||
* |
|||
* @param session |
|||
* @param error |
|||
*/ |
|||
@OnError |
|||
public void onError(Session session, Throwable error) { |
|||
log.error("WebSocket发生错误,错误信息为:" + error.getMessage()); |
|||
error.printStackTrace(); |
|||
} |
|||
|
|||
/** |
|||
* 功能描述: 发送移除黑名单消息 |
|||
* @param userId |
|||
* @Author: lienbo |
|||
* @Date: 2023/8/27 23:19 |
|||
* @return: void |
|||
*/ |
|||
public void sendRemoveBlackList(Long userId) { |
|||
log.info("发送移除黑名单消息 ==>, userId = {}", userId); |
|||
this.sendToOne(userId, "remove"); |
|||
} |
|||
|
|||
/** |
|||
* 群发消息 |
|||
* |
|||
* @param message 消息 |
|||
*/ |
|||
private void sendToAll(String message) { |
|||
// 遍历在线map集合
|
|||
onlineSessionClientMap.forEach((userId, toSession) -> { |
|||
log.info("服务端给客户端群发消息 ==> userId = {}, message = {}", userId, message); |
|||
toSession.getAsyncRemote().sendText(message); |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* 指定发送消息 |
|||
* |
|||
* @param userId |
|||
* @param message |
|||
*/ |
|||
private void sendToOne(Long userId, String message) { |
|||
// 通过sid查询map中是否存在
|
|||
Session toSession = onlineSessionClientMap.get(userId); |
|||
if (toSession == null) { |
|||
log.error("服务端给客户端发送消息 ==> userId = {} 不存在, message = {}", userId, message); |
|||
return; |
|||
} |
|||
// 异步发送
|
|||
log.info("服务端给客户端发送消息 ==> userId = {}, message = {}", userId, message); |
|||
toSession.getAsyncRemote().sendText(message); |
|||
/* |
|||
// 同步发送
|
|||
try { |
|||
toSession.getBasicRemote().sendText(message); |
|||
} catch (IOException e) { |
|||
log.error("发送消息失败,WebSocket IO异常"); |
|||
e.printStackTrace(); |
|||
}*/ |
|||
} |
|||
} |
@ -1,26 +0,0 @@ |
|||
<?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="com.lzbi.wechat.mapper.SysWechatMapper"> |
|||
|
|||
<select id="selectSysWechatById" resultType="com.lzbi.wechat.domain.SysWechat"> |
|||
select id, phone, app_id from sys_wechat where id = #{id} |
|||
</select> |
|||
|
|||
<select id="selectWechatByOpenId" resultType="com.lzbi.wechat.domain.SysWechat"> |
|||
select id, phone, app_id from sys_wechat where open_id = #{openId} |
|||
</select> |
|||
|
|||
<insert id="insertSysWechat" parameterType="com.lzbi.wechat.domain.SysWechat"> |
|||
insert into sys_wechat (open_id, phone) values (#{openId}, #{phone}) |
|||
</insert> |
|||
|
|||
<update id="updateSysWechat"> |
|||
update sys_wechat set open_id = #{openId}, phone = #{phone} where id = #{id} |
|||
</update> |
|||
|
|||
<delete id="deleteSysWechat"> |
|||
delete from sys_wechat where id = #{id} |
|||
</delete> |
|||
</mapper> |
Loading…
Reference in new issue