Merge remote-tracking branch 'origin/master'

This commit is contained in:
zjf committed 2025-04-09 16:10:06 +08:00
commit 75b3a22d0b
99 files changed
+2624 -532

No files matched your search

+28
View File
@@ -30,6 +30,34 @@ CREATE TABLE `third_zy_log`
ROW_FORMAT = DYNAMIC COMMENT ='正元日志表';
-- ----------------------------
-- Table structure for third_door_log
-- ----------------------------
DROP TABLE IF EXISTS `third_door_log`;
CREATE TABLE `third_door_log`
(
`id` bigint NOT NULL COMMENT '主键',
`api_type` tinytext NOT NULL COMMENT '请求类型',
`biz_type` tinytext NOT NULL COMMENT 'api类型',
`biz_id` varchar(2048) DEFAULT NULL COMMENT 'api类型id',
`api_url` text DEFAULT NULL COMMENT 'api url',
`res` text DEFAULT NULL COMMENT 'res',
`req` text DEFAULT NULL COMMENT 'req',
`error` text DEFAULT NULL COMMENT '调用错误',
`time_consuming` char(64) DEFAULT NULL COMMENT '耗时(毫秒)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间',
`tenant_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci
ROW_FORMAT = DYNAMIC COMMENT ='智能柜日志';
-- ----------------------------
-- Table structure for third_zy_id_dict
-- ----------------------------
+44 -12
View File
@@ -35,6 +35,37 @@ CREATE TABLE hard_manager
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='设备管理';
-- ----------------------------
-- Table structure for hard_door_manager
-- ----------------------------
DROP TABLE IF EXISTS `hard_door_manager`;
CREATE TABLE hard_door_manager
(
id bigint NOT NULL COMMENT '编号',
hard_id bigint NOT NULL COMMENT '设备编号',
imei varchar(32) NOT NULL COMMENT '设备 IMEI 号(15 位)',
cabinet_num int DEFAULT NULL COMMENT '货柜数量',
cabinet_camera_num int DEFAULT NULL COMMENT '每个货柜中摄像头数量',
cabinet_weight_unit_num int DEFAULT NULL COMMENT '每个货柜中称重单元数量',
power_status int DEFAULT NULL COMMENT '1:通电;2:断电',
net_status int DEFAULT NULL COMMENT '在线状态。1:在线;2:离线',
sale_status int DEFAULT NULL COMMENT '售卖状态。1:在售;2:停售',
signal_intensity int DEFAULT NULL COMMENT 'sim 信号强度。大于-95 表示信号强度好;-95 到-105 表示信号强度中等;小于-105 表示信号差;',
signal_ratio int DEFAULT NULL COMMENT '信噪比,体现信道传输质量的参数。大于 15 表示质量好;15 到 0 表示质量中等;小于等于 0 表示质量差;',
signal_time int DEFAULT NULL COMMENT 'sim 信号值更新时间。yyyy-MM-dd HH:mm:ss',
cabinet_list text DEFAULT NULL COMMENT '货柜列表JSON',
restart_time datetime DEFAULT NULL COMMENT '上次重启时间',
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
create_time datetime DEFAULT NULL COMMENT '创建时间',
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
update_time datetime DEFAULT NULL COMMENT '修改时间',
del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT ='柜子设备管理';
-- ----------------------------
-- Table structure for hard_group
-- ----------------------------
@@ -329,17 +360,18 @@ CREATE TABLE hard_spu_category
DROP TABLE IF EXISTS hard_spu_repertory;
CREATE TABLE hard_spu_repertory
(
id bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
user_id bigint NOT NULL COMMENT '用户id',
hard_id bigint NOT NULL COMMENT '设备id',
spu_id bigint NOT NULL COMMENT '商品id',
count bigint DEFAULT 0 COMMENT '更新库存数量',
biz_type tinytext NOT NULL COMMENT '上架类型',
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
create_time datetime DEFAULT NULL COMMENT '创建时间',
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
update_time datetime DEFAULT NULL COMMENT '修改时间',
del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
id bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
user_id bigint NOT NULL COMMENT '用户id',
hard_id bigint NOT NULL COMMENT '设备id',
spu_id bigint NOT NULL COMMENT '商品id',
before_count int NOT NULL COMMENT '更新前的库存数量',
count int DEFAULT 0 COMMENT '更新库存数量',
biz_type tinytext NOT NULL COMMENT '上架类型',
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
create_time datetime DEFAULT NULL COMMENT '创建时间',
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
update_time datetime DEFAULT NULL COMMENT '修改时间',
del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (id)
) ENGINE = InnoDB COMMENT ='硬件商品库存更新记录';
@@ -0,0 +1,28 @@
package com.bsd.pjcloud.flow.task.dto;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class BatchCompleteTaskDto {
/**
* 任务id
*/
private List<String> processInstances;
/**
* 任务本地变量
*/
private Map<String, Object> taskLocalParamMap;
/**
* 是否成功 1是 0否
*/
private String isSuccess;
}
@@ -1,6 +1,7 @@
package com.bsd.pjcloud.flow.task.controller;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.flow.task.dto.BatchCompleteTaskDto;
import com.bsd.pjcloud.flow.task.dto.TaskParamDto;
import com.bsd.pjcloud.flow.task.service.ITaskService;
import lombok.RequiredArgsConstructor;
@@ -15,104 +16,123 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/task")
public class TaskController {
private final ITaskService taskService;
private final ITaskService taskService;
/**
* 查询首页数据看板
* @return
*/
@SneakyThrows
@GetMapping("queryTaskData")
public R queryTaskData() {
return taskService.queryTaskData();
}
/**
* 查询首页数据看板
*
* @return
*/
@SneakyThrows
@GetMapping("queryTaskData")
public R queryTaskData() {
return taskService.queryTaskData();
}
/**
* 查询任务
* @param taskId
* @return
*/
@SneakyThrows
@GetMapping("queryTask")
public R queryTask(String taskId, boolean view) {
/**
* 查询任务
*
* @param taskId
* @return
*/
@SneakyThrows
@GetMapping("queryTask")
public R queryTask(String taskId, boolean view) {
return taskService.queryTask(taskId, view);
return taskService.queryTask(taskId, view);
}
}
/**
* 完成任务
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("completeTask")
public R completeTask(@RequestBody TaskParamDto completeParamDto) {
/**
* 完成任务
*
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("completeTask")
public R completeTask(@RequestBody TaskParamDto completeParamDto) {
return taskService.completeTask(completeParamDto);
return taskService.completeTask(completeParamDto);
}
}
/**
* 前加签
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("delegateTask")
public R delegateTask(@RequestBody TaskParamDto completeParamDto) {
/**
* 批量完成任务
*
* @return
*/
@SneakyThrows
@PostMapping("batchCompleteTask")
public R batchCompleteTask(@RequestBody BatchCompleteTaskDto dto) {
return R.ok(taskService.batchCompleteTask(dto));
}
return taskService.delegateTask(completeParamDto);
/**
* 前加签
*
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("delegateTask")
public R delegateTask(@RequestBody TaskParamDto completeParamDto) {
}
return taskService.delegateTask(completeParamDto);
/**
* 加签完成任务
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("resolveTask")
public R resolveTask(@RequestBody TaskParamDto completeParamDto) {
}
return taskService.resolveTask(completeParamDto);
/**
* 加签完成任务
*
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("resolveTask")
public R resolveTask(@RequestBody TaskParamDto completeParamDto) {
}
return taskService.resolveTask(completeParamDto);
/**
* 设置执行人
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("setAssignee")
public R setAssignee(@RequestBody TaskParamDto completeParamDto) {
}
return taskService.setAssignee(completeParamDto);
/**
* 设置执行人
*
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("setAssignee")
public R setAssignee(@RequestBody TaskParamDto completeParamDto) {
}
return taskService.setAssignee(completeParamDto);
/**
* 结束流程
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("stopProcessInstance")
public R stopProcessInstance(@RequestBody TaskParamDto completeParamDto) {
}
return taskService.stopProcessInstance(completeParamDto);
/**
* 结束流程
*
* @param completeParamDto
* @return
*/
@SneakyThrows
@PostMapping("stopProcessInstance")
public R stopProcessInstance(@RequestBody TaskParamDto completeParamDto) {
}
return taskService.stopProcessInstance(completeParamDto);
/**
* 退回
* @param taskParamDto
* @return
*/
@PostMapping("back")
public R back(@RequestBody TaskParamDto taskParamDto) {
return taskService.back(taskParamDto);
}
}
/**
* 退回
*
* @param taskParamDto
* @return
*/
@PostMapping("back")
public R back(@RequestBody TaskParamDto taskParamDto) {
return taskService.back(taskParamDto);
}
}
@@ -1,6 +1,7 @@
package com.bsd.pjcloud.flow.task.service;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.flow.task.dto.BatchCompleteTaskDto;
import com.bsd.pjcloud.flow.task.dto.TaskParamDto;
/**
@@ -8,60 +9,73 @@ import com.bsd.pjcloud.flow.task.dto.TaskParamDto;
*/
public interface ITaskService {
/**
* 查询任务
* @param taskId
* @param view
* @return
*/
R queryTask(String taskId, boolean view);
/**
* 查询任务
*
* @param taskId
* @param view
* @return
*/
R queryTask(String taskId, boolean view);
/**
* 完成任务
* @param taskParamDto
* @return
*/
R completeTask(TaskParamDto taskParamDto);
/**
* 完成任务
*
* @param taskParamDto
* @return
*/
R completeTask(TaskParamDto taskParamDto);
/**
* 前加签
* @param taskParamDto
* @return
*/
R delegateTask(TaskParamDto taskParamDto);
/**
* 批量完成任务
*/
R batchCompleteTask(BatchCompleteTaskDto dto);
/**
* 加签完成任务
* @param taskParamDto
* @return
*/
R resolveTask(TaskParamDto taskParamDto);
/**
* 前加签
*
* @param taskParamDto
* @return
*/
R delegateTask(TaskParamDto taskParamDto);
/**
* 设置执行人
* @param taskParamDto
* @return
*/
R setAssignee(TaskParamDto taskParamDto);
/**
* 加签完成任务
*
* @param taskParamDto
* @return
*/
R resolveTask(TaskParamDto taskParamDto);
/**
* 结束流程
* @param taskParamDto
* @return
*/
R stopProcessInstance(TaskParamDto taskParamDto);
/**
* 设置执行人
*
* @param taskParamDto
* @return
*/
R setAssignee(TaskParamDto taskParamDto);
/**
* 退回
* @param taskParamDto
* @return
*/
R back(TaskParamDto taskParamDto);
/**
* 结束流程
*
* @param taskParamDto
* @return
*/
R stopProcessInstance(TaskParamDto taskParamDto);
/**
* 查询首页数据看板
* @return
*/
R queryTaskData();
/**
* 退回
*
* @param taskParamDto
* @return
*/
R back(TaskParamDto taskParamDto);
/**
* 查询首页数据看板
*
* @return
*/
R queryTaskData();
}
@@ -4,8 +4,13 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.flow.task.dto.*;
import com.bsd.pjcloud.flow.task.entity.Process;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -15,10 +20,6 @@ import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService;
import com.bsd.pjcloud.flow.task.constant.FormTypeEnum;
import com.bsd.pjcloud.flow.task.constant.NodeStatusEnum;
import com.bsd.pjcloud.flow.task.constant.ProcessInstanceConstant;
import com.bsd.pjcloud.flow.task.dto.IndexPageStatistics;
import com.bsd.pjcloud.flow.task.dto.Node;
import com.bsd.pjcloud.flow.task.dto.TaskParamDto;
import com.bsd.pjcloud.flow.task.dto.TaskResultDto;
import com.bsd.pjcloud.flow.task.entity.ProcessCopy;
import com.bsd.pjcloud.flow.task.entity.ProcessInstanceRecord;
import com.bsd.pjcloud.flow.task.entity.ProcessNodeRecordAssignUser;
@@ -31,6 +32,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -40,299 +42,343 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class TaskServiceImpl implements ITaskService {
private final RemoteFlowEngineService flowEngineService;
private final RemoteFlowEngineService flowEngineService;
private final IProcessService processService;
private final IProcessService processService;
private final IProcessCopyService processCopyService;
private final IProcessCopyService processCopyService;
private final IProcessNodeDataService nodeDataService;
private final IProcessNodeDataService nodeDataService;
private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService;
private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService;
private final IProcessInstanceRecordService processInstanceRecordService;
private final IProcessInstanceRecordService processInstanceRecordService;
private final ObjectMapper objectMapper;
private final ObjectMapper objectMapper;
/**
* 查询首页数据看板
* @return
*/
@Override
public R queryTaskData() {
R<IndexPageStatistics> indexPageStatisticsR = flowEngineService
.querySimpleData(SecurityUtils.getUser().getId());
/**
* 查询首页数据看板
*
* @return
*/
@Override
public R queryTaskData() {
R<IndexPageStatistics> indexPageStatisticsR = flowEngineService
.querySimpleData(SecurityUtils.getUser().getId());
// 获取抄送任务
Long copyCount = processCopyService.lambdaQuery()
.eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId())
.count();
indexPageStatisticsR.getData().setCopyNum(copyCount);
return indexPageStatisticsR;
}
// 获取抄送任务
Long copyCount = processCopyService.lambdaQuery()
.eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId())
.count();
indexPageStatisticsR.getData().setCopyNum(copyCount);
return indexPageStatisticsR;
}
/**
* 查询任务
*
* @param taskId
* @param view
* @return
*/
@SneakyThrows
@Override
public R queryTask(String taskId, boolean view) {
/**
* 查询任务
* @param taskId
* @param view
* @return
*/
@SneakyThrows
@Override
public R queryTask(String taskId, boolean view) {
long userId = SecurityUtils.getUser().getId();
long userId = SecurityUtils.getUser().getId();
R<TaskResultDto> r = flowEngineService.queryTask(taskId, userId);
R<TaskResultDto> r = flowEngineService.queryTask(taskId, userId);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
if (!r.isOk()) {
return R.failed(r.getMsg());
}
TaskResultDto taskResultDto = r.getData();
TaskResultDto taskResultDto = r.getData();
// 变量
Map<String, Object> paramMap = taskResultDto.getVariableAll();
// 是否是当前活动任务
Boolean currentTask = taskResultDto.getCurrentTask();
if (!currentTask) {
ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getTaskId, taskId)
.eq(ProcessNodeRecordAssignUser::getUserId, userId)
.eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode())
.last("limit 1")
.orderByDesc(ProcessNodeRecordAssignUser::getEndTime)
.one();
// 变量
Map<String, Object> paramMap = taskResultDto.getVariableAll();
// 是否是当前活动任务
Boolean currentTask = taskResultDto.getCurrentTask();
if (!currentTask) {
ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getTaskId, taskId)
.eq(ProcessNodeRecordAssignUser::getUserId, userId)
.eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode())
.last("limit 1")
.orderByDesc(ProcessNodeRecordAssignUser::getEndTime)
.one();
if (processNodeRecordAssignUser != null) {
String data = processNodeRecordAssignUser.getData();
if (StrUtil.isNotBlank(data)) {
Map<String, Object> collect = objectMapper.readValue(data, new TypeReference<>() {
});
paramMap.putAll(collect);
if (processNodeRecordAssignUser != null) {
String data = processNodeRecordAssignUser.getData();
if (StrUtil.isNotBlank(data)) {
Map<String, Object> collect = objectMapper.readValue(data, new TypeReference<>() {
});
paramMap.putAll(collect);
}
}
}
}
}
// 当前节点数据
Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData();
Map<String, String> formPerms = node.getFormPerms();
}
// 当前节点数据
Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData();
Map<String, String> formPerms = node.getFormPerms();
Process oaForms = processService.getByFlowId(taskResultDto.getFlowId());
if (oaForms == null) {
return R.failed("流程不存在");
}
Process oaForms = processService.getByFlowId(taskResultDto.getFlowId());
if (oaForms == null) {
return R.failed("流程不存在");
}
List<FormItemVO> formItemVOList = JSONUtil.toList(oaForms.getFormItems(), FormItemVO.class);
for (FormItemVO formItemVO : formItemVOList) {
List<FormItemVO> formItemVOList = JSONUtil.toList(oaForms.getFormItems(), FormItemVO.class);
for (FormItemVO formItemVO : formItemVOList) {
String id = formItemVO.getId();
String perm = formPerms.get(id);
if (StrUtil.isNotBlank(perm)) {
formItemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(perm)
? ProcessInstanceConstant.FormPermClass.READ : perm) : perm);
}
else {
formItemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE);
}
if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) {
// 明细
List<Map<String, Object>> subParamList = MapUtil.get(paramMap, id,
new cn.hutool.core.lang.TypeReference<>() {
});
Object value = formItemVO.getProps().getValue();
List<List<FormItemVO>> l = new ArrayList<>();
for (Map<String, Object> map : subParamList) {
List<FormItemVO> subItemList = Convert.toList(FormItemVO.class, value);
for (FormItemVO itemVO : subItemList) {
itemVO.getProps().setValue(map.get(itemVO.getId()));
String permSub = formPerms.get(itemVO.getId());
if (StrUtil.isNotBlank(permSub)) {
itemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(permSub)
? ProcessInstanceConstant.FormPermClass.READ : permSub) : permSub);
}
else {
itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE);
}
}
l.add(subItemList);
}
formItemVO.getProps().setValue(l);
{
List<FormItemVO> subItemList = Convert.toList(FormItemVO.class, value);
for (FormItemVO itemVO : subItemList) {
String permSub = formPerms.get(itemVO.getId());
if (StrUtil.isNotBlank(permSub)) {
itemVO.setPerm(permSub);
}
else {
itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE);
}
}
formItemVO.getProps().setOriForm(subItemList);
}
}
else {
formItemVO.getProps().setValue(paramMap.get(id));
}
}
Dict set = Dict.create()
.set("processInstanceId", taskResultDto.getProcessInstanceId())
.set("node", taskResultDto.getTaskNode())
.set("process", oaForms.getProcess())
.set("delegateAgain", taskResultDto.getDelegate())
.set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING"))
.set("formItems", formItemVOList);
return R.ok(set);
}
/**
* 完成任务
* @param taskParamDto
* @return
*/
@Override
public R completeTask(TaskParamDto taskParamDto) {
long userId = SecurityUtils.getUser().getId();
taskParamDto.setUserId(String.valueOf(userId));
R r = flowEngineService.completeTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 前加签
* @param taskParamDto
* @return
*/
@Transactional
@Override
public R delegateTask(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.delegateTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 加签完成任务
* @param taskParamDto
* @return
*/
@Override
public R resolveTask(TaskParamDto taskParamDto) {
R r = flowEngineService.resolveTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 设置执行人
* @param taskParamDto
* @return
*/
@Override
public R setAssignee(TaskParamDto taskParamDto) {
R r = flowEngineService.transferTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 结束流程
* @param taskParamDto
* @return
*/
@Override
public R stopProcessInstance(TaskParamDto taskParamDto) {
String processInstanceId = taskParamDto.getProcessInstanceId();
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId);
CollUtil.reverse(allStopProcessInstanceIdList);
allStopProcessInstanceIdList.add(processInstanceId);
taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList);
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.stopProcessInstance(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 退回
* @param taskParamDto
* @return
*/
@Override
public R back(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.back(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
private List<String> getAllStopProcessInstanceIdList(String processInstanceId) {
List<ProcessInstanceRecord> list = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId)
.list();
List<String> collect = list.stream().map(w -> w.getProcessInstanceId()).collect(Collectors.toList());
for (ProcessInstanceRecord processInstanceRecord : list) {
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(
processInstanceRecord.getProcessInstanceId());
collect.addAll(allStopProcessInstanceIdList);
}
return collect;
}
String id = formItemVO.getId();
String perm = formPerms.get(id);
if (StrUtil.isNotBlank(perm)) {
formItemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(perm)
? ProcessInstanceConstant.FormPermClass.READ : perm) : perm);
} else {
formItemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE);
}
if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) {
// 明细
List<Map<String, Object>> subParamList = MapUtil.get(paramMap, id,
new cn.hutool.core.lang.TypeReference<>() {
});
Object value = formItemVO.getProps().getValue();
List<List<FormItemVO>> l = new ArrayList<>();
for (Map<String, Object> map : subParamList) {
List<FormItemVO> subItemList = Convert.toList(FormItemVO.class, value);
for (FormItemVO itemVO : subItemList) {
itemVO.getProps().setValue(map.get(itemVO.getId()));
String permSub = formPerms.get(itemVO.getId());
if (StrUtil.isNotBlank(permSub)) {
itemVO.setPerm(view ? (ProcessInstanceConstant.FormPermClass.EDIT.equals(permSub)
? ProcessInstanceConstant.FormPermClass.READ : permSub) : permSub);
} else {
itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE);
}
}
l.add(subItemList);
}
formItemVO.getProps().setValue(l);
{
List<FormItemVO> subItemList = Convert.toList(FormItemVO.class, value);
for (FormItemVO itemVO : subItemList) {
String permSub = formPerms.get(itemVO.getId());
if (StrUtil.isNotBlank(permSub)) {
itemVO.setPerm(permSub);
} else {
itemVO.setPerm(ProcessInstanceConstant.FormPermClass.HIDE);
}
}
formItemVO.getProps().setOriForm(subItemList);
}
} else {
formItemVO.getProps().setValue(paramMap.get(id));
}
}
Dict set = Dict.create()
.set("processInstanceId", taskResultDto.getProcessInstanceId())
.set("node", taskResultDto.getTaskNode())
.set("process", oaForms.getProcess())
.set("delegateAgain", taskResultDto.getDelegate())
.set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING"))
.set("formItems", formItemVOList);
return R.ok(set);
}
/**
* 完成任务
*
* @param taskParamDto
* @return
*/
@Override
public R completeTask(TaskParamDto taskParamDto) {
long userId = SecurityUtils.getUser().getId();
taskParamDto.setUserId(String.valueOf(userId));
R r = flowEngineService.completeTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
@Override
public R batchCompleteTask(BatchCompleteTaskDto dto) {
if (ObjectUtil.isEmpty(dto.getProcessInstances())) return R.failed();
PjcloudUser user = SecurityUtils.getUser();
TaskParamDto taskParamDto = new TaskParamDto();
taskParamDto.setUserId(String.valueOf(user.getId()));
for (String v : dto.getProcessInstances()) {
TaskDto taskDto = flowEngineService.queryAssignTaskOne(v).getData();
if (ObjectUtil.isEmpty(taskDto)) continue;
TaskParamDto currentTaskDto = BeanUtils.toBean(taskParamDto, TaskParamDto.class);
currentTaskDto.setTaskId(taskDto.getTaskId());
currentTaskDto.setTaskLocalParamMap(dto.getTaskLocalParamMap());
if (ObjectUtil.equals(dto.getIsSuccess(), YesNoEnum.YES.getCode())) {
Map<String, Object> taskMap = (Map<String, Object>) queryTask(taskDto.getTaskId(), false).getData();
List<FormItemVO> formItems = (List<FormItemVO>) taskMap.get("formItems");
Map<String, Object> paramsMap = new HashMap<>();
for (FormItemVO i : formItems) {
if (ObjectUtil.isNotEmpty(i.getProps()) && ObjectUtil.isNotEmpty(i.getProps().getValue())) {
paramsMap.put(i.getId(), i.getProps().getValue());
}
}
paramsMap.put(taskDto.getNodeId() + "_approve_condition", true);
currentTaskDto.setParamMap(paramsMap);
} else if (ObjectUtil.equals(dto.getIsSuccess(), YesNoEnum.NO.getCode())) {
Map<String, Object> errorParamsMap = new HashMap<>();
errorParamsMap.put(taskDto.getNodeId() + "_approve_condition", false);
currentTaskDto.setParamMap(errorParamsMap);
} else {
continue;
}
try {
String data = flowEngineService.completeTask(currentTaskDto).getData();
log.info("批量审批结果:{}", data);
} catch (Exception e) {
log.error("批量审批错误", e);
}
}
return null;
}
/**
* 前加签
*
* @param taskParamDto
* @return
*/
@Transactional
@Override
public R delegateTask(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.delegateTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 加签完成任务
*
* @param taskParamDto
* @return
*/
@Override
public R resolveTask(TaskParamDto taskParamDto) {
R r = flowEngineService.resolveTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 设置执行人
*
* @param taskParamDto
* @return
*/
@Override
public R setAssignee(TaskParamDto taskParamDto) {
R r = flowEngineService.transferTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 结束流程
*
* @param taskParamDto
* @return
*/
@Override
public R stopProcessInstance(TaskParamDto taskParamDto) {
String processInstanceId = taskParamDto.getProcessInstanceId();
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId);
CollUtil.reverse(allStopProcessInstanceIdList);
allStopProcessInstanceIdList.add(processInstanceId);
taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList);
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.stopProcessInstance(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
/**
* 退回
*
* @param taskParamDto
* @return
*/
@Override
public R back(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.back(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
private List<String> getAllStopProcessInstanceIdList(String processInstanceId) {
List<ProcessInstanceRecord> list = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId)
.list();
List<String> collect = list.stream().map(w -> w.getProcessInstanceId()).collect(Collectors.toList());
for (ProcessInstanceRecord processInstanceRecord : list) {
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(
processInstanceRecord.getProcessInstanceId());
collect.addAll(allStopProcessInstanceIdList);
}
return collect;
}
}
@@ -0,0 +1,8 @@
package com.bsd.pjcloud.hard.api.dto.manager;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import lombok.Data;
@Data
public class HardDoorManagerDto extends HardDoorManagerEntity {
}
@@ -1,6 +1,6 @@
package com.bsd.pjcloud.hard.api.dto;
package com.bsd.pjcloud.hard.api.dto.manager;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import lombok.Data;
import java.util.List;
@@ -0,0 +1,154 @@
package com.bsd.pjcloud.hard.api.entity.manager;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import com.bsd.pjcloud.common.core.util.TenantTable;
import java.time.LocalDateTime;
/**
* 智能柜设置
*
* @author dzc
* @date 2025-04-08 18:50:53
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@TenantTable
@TableName("hard_door_manager")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "智能柜设置")
public class HardDoorManagerEntity extends Model<HardDoorManagerEntity> {
/**
* 编号
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "编号")
private Long id;
/**
* 设备编号
*/
@Schema(description = "设备编号")
private Long hardId;
/**
* 设备 IMEI 号(15 位)
*/
@Schema(description = "设备 IMEI 号(15 位)")
private String imei;
/**
* 货柜数量
*/
@Schema(description = "货柜数量")
private Integer cabinetNum;
/**
* 每个货柜中摄像头数量
*/
@Schema(description = "每个货柜中摄像头数量")
private Integer cabinetCameraNum;
/**
* 每个货柜中称重单元数量
*/
@Schema(description = "每个货柜中称重单元数量")
private Integer cabinetWeightUnitNum;
/**
* 1:通电;2:断电
*/
@Schema(description = "1:通电;2:断电")
private Integer powerStatus;
/**
* 在线状态。1:在线;2:离线
*/
@Schema(description = "在线状态。1:在线;2:离线")
private Integer netStatus;
/**
* 售卖状态。1:在售;2:停售
*/
@Schema(description = "售卖状态。1:在售;2:停售")
private Integer saleStatus;
/**
* sim 信号强度。大于-95 表示信号强度好;-95 到-105 表示信号强度中等;小于-105 表示信号差;
*/
@Schema(description = "sim 信号强度。大于-95 表示信号强度好;-95 到-105 表示信号强度中等;小于-105 表示信号差;")
private Integer signalIntensity;
/**
* 信噪比,体现信道传输质量的参数。大于 15 表示质量好;15 到 0 表示质量中等;小于等于 0 表示质量差;
*/
@Schema(description = "信噪比,体现信道传输质量的参数。大于 15 表示质量好;15 到 0 表示质量中等;小于等于 0 表示质量差;")
private Integer signalRatio;
/**
* sim 信号值更新时间。yyyy-MM-dd HH:mm:ss
*/
@Schema(description = "sim 信号值更新时间。yyyy-MM-dd HH:mm:ss")
private Integer signalTime;
/**
* 货柜列表JSON
*/
@Schema(description = "货柜列表JSON")
private String cabinetList;
/**
* 上次重启时间
*/
@Schema(description = "上次重启时间")
private LocalDateTime restartTime;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.hard.api.entity;
package com.bsd.pjcloud.hard.api.entity.manager;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
@@ -48,6 +48,12 @@ public class HardSpuRepertoryEntity extends Model<HardSpuRepertoryEntity> {
@Schema(description = "商品id")
private Long spuId;
/**
* 更新前的库存数量
*/
@Schema(description = "更新前的库存数量")
private Integer beforeCount;
/**
* 更新库存数量
*/
@@ -55,7 +61,7 @@ public class HardSpuRepertoryEntity extends Model<HardSpuRepertoryEntity> {
@Min(value = 1, message = "更新库存数量不能小于1")
@Max(value = 100, message = "更新库存数量不能大于100")
@Schema(description = "更新库存数量")
private Long count;
private Integer count;
/**
* 上架类型
@@ -6,7 +6,7 @@ import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.hard.api.dto.code.QRCodeDto;
import com.bsd.pjcloud.hard.api.entity.HardGroupEntity;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.vo.base.BaseHardGroupInterface;
import com.bsd.pjcloud.hard.api.vo.base.BaseHardInterface;
@@ -0,0 +1,15 @@
package com.bsd.pjcloud.hard.api.vo.manager;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import lombok.Data;
@Data
public class HardDoorManagerVo extends HardDoorManagerEntity {
/**
* 硬件设备相关
*/
private String hardName;
private String hardType;
}
@@ -1,7 +1,7 @@
package com.bsd.pjcloud.hard.api.vo;
package com.bsd.pjcloud.hard.api.vo.manager;
import com.bsd.pjcloud.admin.api.vo.base.BaseDeptInterface;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.vo.base.BaseHardGroupInterface;
import com.bsd.pjcloud.wallet.api.vo.base.BaseMchInterface;
import lombok.Data;
@@ -31,13 +31,13 @@ public class HardOrderExcelVo {
private String hourType;
@ExcelProperty("商品总价")
private Integer totalPrice;
private Double totalPrice;
@ExcelProperty("额外支付")
private Integer extraPrice;
private Double extraPrice;
@ExcelProperty("实际支付")
private Integer payPrice;
private Double payPrice;
@ExcelProperty("订单支付时间")
private LocalDateTime payTime;
@@ -9,7 +9,7 @@ import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto;
import com.bsd.pjcloud.hard.api.dto.hard.HardBindDto;
import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto;
import com.bsd.pjcloud.hard.api.vo.HardInvoiceVo;
import com.bsd.pjcloud.hard.api.vo.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.android.HardAdUserVo;
import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
@@ -0,0 +1,93 @@
package com.bsd.pjcloud.hard.controller.manager;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo;
import com.bsd.pjcloud.hard.service.HardDoorManagerService;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 智能柜设置
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/hard-door-manager")
@Tag(description = "hard-door-manager", name = "智能柜设置管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class HardDoorManagerController {
private final HardDoorManagerService hardDoorManagerService;
@Operation(summary = "绑定设备", description = "绑定设备")
@PostMapping("/bind")
@PreAuthorize("@pms.hasPermission('hard_hardDoorManager_add')")
public R bind(@RequestBody HardDoorManagerEntity dto) {
if (ObjectUtil.isEmpty(dto.getImei())) throw new RuntimeException("设备IMEI卡号不能为空");
hardDoorManagerService.bind(dto);
return R.ok();
}
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@PreAuthorize("@pms.hasPermission('hard_hardDoorManager_view')")
public R getHardDoorManagerPage(@ParameterObject Page page, @ParameterObject HardDoorManagerEntity hardDoorManager) {
LambdaQueryWrapper<HardDoorManagerEntity> wrapper = Wrappers.lambdaQuery();
return R.ok(hardDoorManagerService.page(page, wrapper));
}
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page-join")
@PreAuthorize("@pms.hasPermission('hard_hardDoorManager_view')")
public R pageJoin(@ParameterObject Page page, @ParameterObject HardDoorManagerDto dto) {
DataScope dataScope = new DataScope();
return R.ok(hardDoorManagerService.scopePageJoin(page, dto, dataScope));
}
@Operation(summary = "通过id查询", description = "通过id查询")
@GetMapping("/{id}")
@PreAuthorize("@pms.hasPermission('hard_hardDoorManager_view')")
public R getById(@PathVariable("id") Long id) {
return R.ok(hardDoorManagerService.getById(id));
}
@Operation(summary = "根据硬件id查询详情", description = "根据硬件id查询详情")
@GetMapping("/get-by-hard-id")
@PreAuthorize("@pms.hasPermission('hard_hardDoorManager_view')")
public R<HardDoorManagerVo> getByHardId(@RequestParam Long hardId) {
return R.ok(hardDoorManagerService.getByHardId(hardId));
}
@Operation(summary = "通过id删除智能柜设置", description = "通过id删除智能柜设置")
@SysLog("通过id删除智能柜设置")
@DeleteMapping
@PreAuthorize("@pms.hasPermission('hard_hardDoorManager_del')")
public R removeById(@RequestBody Long[] ids) {
return R.ok(hardDoorManagerService.removeBatchByIds(CollUtil.toList(ids)));
}
@ResponseExcel
@GetMapping("/export")
@PreAuthorize("@pms.hasPermission('hard_hardDoorManager_export')")
public List<HardDoorManagerEntity> export(HardDoorManagerEntity hardDoorManager, Long[] ids) {
return hardDoorManagerService.list(Wrappers.lambdaQuery(hardDoorManager).in(ArrayUtil.isNotEmpty(ids), HardDoorManagerEntity::getId, ids));
}
}
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.hard.controller;
package com.bsd.pjcloud.hard.controller.manager;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.collection.CollUtil;
@@ -9,9 +9,8 @@ import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.hard.api.dto.HardInvoiceDto;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.service.HardManagerService;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
@@ -277,15 +277,15 @@ public class HardOrderController {
lineNumber++;
if (ObjectUtil.isNotEmpty(v.getTotalPrice())) {
totalPriceSum = totalPriceSum.add(BigDecimal.valueOf(v.getTotalPrice()));
v.setTotalPrice(BigDecimal.valueOf(v.getTotalPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).intValue());
v.setTotalPrice(BigDecimal.valueOf(v.getTotalPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
if (ObjectUtil.isNotEmpty(v.getExtraPrice())) {
extraPriceSum = extraPriceSum.add(BigDecimal.valueOf(v.getExtraPrice()));
v.setExtraPrice(BigDecimal.valueOf(v.getExtraPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).intValue());
v.setExtraPrice(BigDecimal.valueOf(v.getExtraPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
if (ObjectUtil.isNotEmpty(v.getPayPrice())) {
payPriceSum = payPriceSum.add(BigDecimal.valueOf(v.getPayPrice()));
v.setPayPrice(BigDecimal.valueOf(v.getPayPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).intValue());
v.setPayPrice(BigDecimal.valueOf(v.getPayPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
if (ObjectUtil.isNotEmpty(v.getHourType())) {
HardHourTypeEnum hardHourTypeEnum = HardHourTypeEnum.valueOfByType(v.getHourType());
@@ -80,8 +80,10 @@ public class HardSpuRepertoryController {
@SysLog("修改硬件商品库存更新记录")
@PutMapping
@PreAuthorize("@pms.hasPermission('hard_hardSpuRepertory_edit')")
public R updateById(@RequestBody HardSpuRepertoryEntity hardSpuRepertory) {
return R.ok(hardSpuRepertoryService.updateById(hardSpuRepertory));
public R updateById(@Validated @RequestBody HardSpuRepertoryEntity hardSpuRepertory) {
PjcloudUser user = SecurityUtils.getUser();
hardSpuRepertoryService.edit(hardSpuRepertory, user);
return R.ok();
}
@Operation(summary = "通过id删除硬件商品库存更新记录", description = "通过id删除硬件商品库存更新记录")
@@ -89,7 +91,8 @@ public class HardSpuRepertoryController {
@DeleteMapping
@PreAuthorize("@pms.hasPermission('hard_hardSpuRepertory_del')")
public R removeById(@RequestBody Long[] ids) {
return R.ok(hardSpuRepertoryService.removeBatchByIds(CollUtil.toList(ids)));
hardSpuRepertoryService.delByIds(CollUtil.toList(ids));
return R.ok();
}
@ResponseExcel
@@ -0,0 +1,18 @@
package com.bsd.pjcloud.hard.mapper.manager;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface HardDoorManagerMapper extends PjcloudBaseMapper<HardDoorManagerEntity> {
Page<HardDoorManagerVo> scopePageJoin(Page page, @Param("dto") HardDoorManagerDto dto, DataScope dataScope);
HardDoorManagerVo pageJoin(@Param("hardId") Long hardId);
}
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.hard.mapper;
package com.bsd.pjcloud.hard.mapper.manager;
import cn.hutool.core.util.ObjectUtil;
@@ -7,9 +7,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.vo.HardManagerVo;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -4,12 +4,11 @@ import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderSumAndCountDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.vo.order.*;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.hard.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo;
public interface HardDoorManagerService extends IService<HardDoorManagerEntity> {
Page<HardDoorManagerVo> scopePageJoin(Page page, HardDoorManagerDto dto, DataScope dataScope);
/**
* 根据硬件id查询详情
*/
HardDoorManagerVo getByHardId(Long hardId);
/**
* 绑定设备
*/
void bind(HardDoorManagerEntity dto);
}
@@ -3,11 +3,11 @@ package com.bsd.pjcloud.hard.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.hard.CurrentUserHardTypeInfoDto;
import com.bsd.pjcloud.hard.api.dto.hard.HardBindDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.vo.HardManagerVo;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import java.util.List;
@@ -8,6 +8,8 @@ import com.bsd.pjcloud.hard.api.dto.spu.HardSpuRepertoryDto;
import com.bsd.pjcloud.hard.api.entity.spu.HardSpuRepertoryEntity;
import com.bsd.pjcloud.hard.api.vo.spu.HardSpuRepertoryVo;
import java.util.ArrayList;
public interface HardSpuRepertoryService extends IService<HardSpuRepertoryEntity> {
Page<HardSpuRepertoryVo> scopePageJoin(Page page, HardSpuRepertoryDto dto, DataScope dataScope);
@@ -16,4 +18,14 @@ public interface HardSpuRepertoryService extends IService<HardSpuRepertoryEntity
* 新增
*/
Long create(HardSpuRepertoryEntity entity, PjcloudUser user);
/**
* 修改
*/
void edit(HardSpuRepertoryEntity entity, PjcloudUser user);
/**
* 删除
*/
void delByIds(ArrayList<Long> list);
}
@@ -24,14 +24,14 @@ import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
import com.bsd.pjcloud.hard.api.dto.HardInvoiceDto;
import com.bsd.pjcloud.hard.api.entity.HardInvoiceEntity;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.utils.Drawing2D;
import com.bsd.pjcloud.hard.api.vo.HardInvoiceVo;
import com.bsd.pjcloud.hard.api.vo.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import com.bsd.pjcloud.hard.mapper.HardInvoiceMapper;
import com.bsd.pjcloud.hard.mapper.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.HardCarService;
import com.bsd.pjcloud.hard.service.HardInvoiceService;
@@ -188,7 +188,9 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService {
* 查询正元默认商户信息
*/
private MchManageVo getZyDefaultMch() {
return remoteMchService.getById(zyCallbackConfig.getMchId()).getData();
MchManageVo defaultMch = remoteMchService.getById(zyCallbackConfig.getMchId()).getData();
log.info("查询正元默认商户信息mchId|{}|defaultMch{}", zyCallbackConfig.getMchId(), JSONUtil.toJsonStr(defaultMch));
return defaultMch;
}
}
@@ -0,0 +1,43 @@
package com.bsd.pjcloud.hard.service.impl.manager;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo;
import com.bsd.pjcloud.hard.mapper.manager.HardDoorManagerMapper;
import com.bsd.pjcloud.hard.service.HardDoorManagerService;
import org.springframework.stereotype.Service;
/**
* 智能柜设置
*/
@Service
public class HardDoorManagerServiceImpl extends ServiceImpl<HardDoorManagerMapper, HardDoorManagerEntity> implements HardDoorManagerService {
@Override
public Page<HardDoorManagerVo> scopePageJoin(Page page, HardDoorManagerDto dto, DataScope dataScope) {
return baseMapper.scopePageJoin(page, dto, dataScope);
}
/**
* 根据硬件id查询详情
*/
@Override
public HardDoorManagerVo getByHardId(Long hardId) {
return baseMapper.pageJoin(hardId);
}
/**
* 绑定设备
*/
@Override
public void bind(HardDoorManagerEntity dto) {
HardDoorManagerEntity saveOrUpdate = new HardDoorManagerEntity();
saveOrUpdate.setId(dto.getId());
saveOrUpdate.setHardId(dto.getHardId());
saveOrUpdate.setImei(dto.getImei());
baseMapper.insertOrUpdate(saveOrUpdate);
}
}
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.hard.service.impl;
package com.bsd.pjcloud.hard.service.impl.manager;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
@@ -16,16 +16,19 @@ import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
import com.bsd.pjcloud.hard.api.dto.HardGroupDto;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.hard.CurrentUserHardTypeInfoDto;
import com.bsd.pjcloud.hard.api.dto.hard.HardBindDto;
import com.bsd.pjcloud.hard.api.entity.HardGroupEntity;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
import com.bsd.pjcloud.hard.api.vo.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import com.bsd.pjcloud.hard.mapper.HardGroupMapper;
import com.bsd.pjcloud.hard.mapper.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.service.HardDoorManagerService;
import com.bsd.pjcloud.hard.service.HardManagerService;
import com.bsd.pjcloud.hard.mqtt.config.MqttConfig;
import com.bsd.pjcloud.hard.utils.MqTopicUtil;
@@ -54,6 +57,8 @@ public class HardManagerServiceImpl extends ServiceImpl<HardManagerMapper, HardM
private final MqttConfig mqttConfig;
private final HardDoorManagerService hardDoorManagerService;
private final HardGroupMapper hardGroupMapper;
private final RemoteUserService userService;
@@ -264,7 +269,6 @@ public class HardManagerServiceImpl extends ServiceImpl<HardManagerMapper, HardM
return count > 0;
}
private String createMqConfigByAction(Long groupId, Long deptId, Long hardId, Integer action) {
MqTopicUtil eventDto = MqTopicUtil.builder().groupId(groupId).deptId(deptId).hardId(hardId).build();
if (ObjectUtil.equals(action, 1)) {
@@ -23,20 +23,20 @@ import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto;
import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto;
import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto;
import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
import com.bsd.pjcloud.hard.mapper.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.HardCarService;
import com.bsd.pjcloud.hard.service.HardInvoiceService;
@@ -14,15 +14,15 @@ import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.hard.CurrentUserHardTypeInfoDto;
import com.bsd.pjcloud.hard.api.dto.order.HardDeptTotalDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderSumAndCountDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
import com.bsd.pjcloud.hard.api.vo.order.*;
import com.bsd.pjcloud.hard.mapper.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.HardManagerService;
import com.bsd.pjcloud.hard.service.HardOrderTotalService;
@@ -35,11 +35,8 @@ import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
import com.bsd.pjcloud.wallet.api.vo.WalletTransactionSumAndCountVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.jcajce.provider.util.SecretKeyUtil;
import org.springframework.security.concurrent.DelegatingSecurityContextExecutor;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.context.request.RequestContextHolder;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.hard.api.dto.spu.HardSpuCategoryDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.spu.HardSpuCategoryEntity;
import com.bsd.pjcloud.hard.api.vo.spu.HardSpuCategoryVo;
import com.bsd.pjcloud.hard.mapper.spu.HardSpuCategoryMapper;
@@ -1,6 +1,7 @@
package com.bsd.pjcloud.hard.service.impl.spu;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.admin.api.entity.SysUser;
@@ -11,14 +12,14 @@ import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.hard.api.constant.spu.SpuRepertoryTypeEnum;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.spu.HardSpuRepertoryDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity;
import com.bsd.pjcloud.hard.api.entity.spu.HardSpuRepertoryEntity;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
import com.bsd.pjcloud.hard.api.vo.spu.HardSpuRepertoryVo;
import com.bsd.pjcloud.hard.mapper.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.spu.HardSpuRepertoryMapper;
import com.bsd.pjcloud.hard.service.HardSpuRepertoryService;
import com.bsd.pjcloud.hard.service.HardSpuService;
@@ -28,6 +29,7 @@ import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
@@ -60,23 +62,92 @@ public class HardSpuRepertoryServiceImpl extends ServiceImpl<HardSpuRepertoryMap
* 新增
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Long create(HardSpuRepertoryEntity entity, PjcloudUser user) {
// 查询商品
HardSpuEntity spuDetail = hardSpuService.getById(entity.getSpuId());
if (ObjectUtil.isEmpty(spuDetail)) {
throw new RuntimeException("商品不存在");
}
Integer beforeCount = 0;
if (ObjectUtil.isNotEmpty(spuDetail.getRepertoryCount())) {
beforeCount = spuDetail.getRepertoryCount();
}
entity.setBeforeCount(beforeCount);
entity.setUserId(user.getId());
entity.setHardId(spuDetail.getHardId());
entity.setBizType(SpuRepertoryTypeEnum.HANDLER.getType());
baseMapper.insert(entity);
// 更新商品库存
HardSpuEntity spu = new HardSpuEntity();
spu.setId(spuDetail.getId());
spu.setRepertoryCount(entity.getCount() + beforeCount);
hardSpuService.updateById(spu);
return entity.getId();
}
/**
* 修改
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void edit(HardSpuRepertoryEntity entity, PjcloudUser user) {
// 查询商品
HardSpuEntity spuDetail = hardSpuService.getById(entity.getSpuId());
if (ObjectUtil.isEmpty(spuDetail)) {
throw new RuntimeException("商品不存在");
}
// 查询上架记录
HardSpuRepertoryEntity repertoryDetail = baseMapper.selectById(entity.getId());
if (ObjectUtil.isEmpty(repertoryDetail)) {
throw new RuntimeException("上架记录不存在");
}
Integer beforeCount = 0;
if (ObjectUtil.isNotEmpty(spuDetail.getRepertoryCount())) {
beforeCount = spuDetail.getRepertoryCount();
}
entity.setUserId(user.getId());
baseMapper.updateById(entity);
// 更新商品库存
HardSpuEntity spu = new HardSpuEntity();
spu.setId(spuDetail.getId());
spu.setRepertoryCount(entity.getCount() + beforeCount - repertoryDetail.getCount());
hardSpuService.updateById(spu);
entity.getId();
}
/**
* 删除
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void delByIds(ArrayList<Long> list) {
if (ObjectUtil.isEmpty(list)) return;
List<HardSpuRepertoryEntity> spuRepertoryList = baseMapper.selectList(new LambdaQueryWrapper<HardSpuRepertoryEntity>()
.in(HardSpuRepertoryEntity::getId, list)
);
for (HardSpuRepertoryEntity v : spuRepertoryList) {
// 删除
baseMapper.deleteById(v.getId());
// 更新商品库存
// 查询商品
HardSpuEntity spuDetail = hardSpuService.getById(v.getSpuId());
if (ObjectUtil.isEmpty(spuDetail)) {
throw new RuntimeException("商品<" + spuDetail.getName() + ">不存在");
}
HardSpuEntity spu = new HardSpuEntity();
spu.setId(v.getSpuId());
spu.setRepertoryCount(spuDetail.getRepertoryCount() - v.getCount());
hardSpuService.updateById(spu);
baseMapper.deleteById(v.getId());
}
}
private void disposeList(List<HardSpuRepertoryVo> list, HardSpuRepertoryDto dto) {
if (ObjectUtil.isEmpty(list)) return;
// 商户
List<Long> mchIds = list.stream().map(HardSpuRepertoryVo::getSpuMchId).filter(ObjectUtil::isNotEmpty).distinct().toList();
list.forEach(v -> v.setMerchantId(v.getSpuMchId()));
if (ObjectUtil.isNotEmpty(mchIds)) {
List<MchManageVo> mchList = remoteMchService.getByIds(mchIds).getData();
if (ObjectUtil.isNotEmpty(mchList)) {
@@ -6,14 +6,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.hard.api.dto.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.dto.spu.HardSpuDto;
import com.bsd.pjcloud.hard.api.entity.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
import com.bsd.pjcloud.hard.api.vo.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.spu.HardSpuVo;
import com.bsd.pjcloud.hard.mapper.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.spu.HardSpuMapper;
import com.bsd.pjcloud.hard.service.HardManagerService;
import com.bsd.pjcloud.hard.service.HardSpuService;
@@ -0,0 +1,92 @@
<?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.bsd.pjcloud.hard.mapper.manager.HardDoorManagerMapper">
<resultMap id="hardDoorManagerMap" type="com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto">
<id property="id" column="id"/>
<result property="hardId" column="hard_id"/>
<result property="imei" column="imei"/>
<result property="cabinetNum" column="cabinet_num"/>
<result property="cabinetCameraNum" column="cabinet_camera_num"/>
<result property="cabinetWeightUnitNum" column="cabinet_weight_unit_num"/>
<result property="powerStatus" column="power_status"/>
<result property="netStatus" column="net_status"/>
<result property="saleStatus" column="sale_status"/>
<result property="signalIntensity" column="signal_intensity"/>
<result property="signalRatio" column="signal_ratio"/>
<result property="signalTime" column="signal_time"/>
<result property="cabinetList" column="cabinet_list"/>
<result property="restartTime" column="restart_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
<sql id="selectA">
select a.id,
a.hard_id,
a.imei,
a.cabinet_num,
a.cabinet_camera_num,
a.cabinet_weight_unit_num,
a.power_status,
a.net_status,
a.sale_status,
a.signal_intensity,
a.signal_ratio,
a.signal_time,
a.cabinet_list,
a.restart_time,
a.create_by,
a.create_time,
a.update_by,
a.update_time,
a.del_flag,
a.tenant_id,
</sql>
<sql id="whereA">
a.del_flag = '0'
<if test="dto.hardId != null">
and a.hard_id = #{dto.hardId}
</if>
<if test="dto.imei != null and dto.imei != '' ">
and a.imei like concat('%', #{dto.imei}, '%')
</if>
<if test="dto.powerStatus != null">
and a.power_status = #{dto.powerStatus}
</if>
<if test="dto.netStatus != null">
and a.net_status = #{dto.netStatus}
</if>
<if test="dto.saleStatus != null">
and a.sale_status = #{dto.saleStatus}
</if>
</sql>
<sql id="selectPage">
<include refid="selectA"/>
m.name as hardName,
m.type as hardType
from hard_door_manager a
left join hard_manager m on m.id = a.hard_id
</sql>
<select id="scopePageJoin" resultType="com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo">
<include refid="selectPage"/>
<where>
<include refid="whereA"/>
</where>
order by a.create_time desc , a.id desc
</select>
<select id="pageJoin" resultType="com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo">
<include refid="selectPage"/>
<where>
a.hard_id = #{hardId}
</where>
</select>
</mapper>
@@ -1,8 +1,8 @@
<?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.bsd.pjcloud.hard.mapper.HardManagerMapper">
<resultMap id="hardManagerMap" type="com.bsd.pjcloud.hard.api.entity.HardManagerEntity">
<mapper namespace="com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper">
<resultMap id="hardManagerMap" type="com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity">
<id property="id" column="id"/>
<result property="merchantId" column="merchant_id"/>
<result property="deptId" column="dept_id"/>
@@ -82,6 +82,9 @@
<sql id="whereA">
a.del_flag = '0'
<if test="dto.orderStatus != null and dto.orderStatus != '' ">
and a.order_status = #{dto.orderStatus}
</if>
<if test="dto.merchantType != null and dto.merchantType != '' ">
and a.merchant_type = #{dto.merchantType}
</if>
@@ -266,12 +269,12 @@
<select id="sumAndCount" resultType="com.bsd.pjcloud.hard.api.vo.order.HardOrderSumAndCountVo">
select
a.dept_id,
a.user_dept_id as deptId,
sum(a.pay_price) as sum,
count(0) as count
from hard_order a
<where>
a.del_flag = 0 and a.dept_id is not null
a.del_flag = 0
<if test="dto.walletTypeId != null">
</if>
<if test="dto.orderStatusCodes != null and dto.orderStatusCodes.size() != 0">
@@ -290,7 +293,7 @@
and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]}
</if>
</where>
group by a.dept_id
group by a.user_dept_id
</select>
<select id="totalYearMonthDay" resultType="com.bsd.pjcloud.hard.api.vo.order.HardZyCardSyncVo">
@@ -16,6 +16,7 @@
<result property="ksStatus" column="ks_status"/>
<result property="ksStatusTitle" column="ks_status_title"/>
<result property="ksComments" column="ks_comments"/>
<result property="hardDoorNumber" column="hard_door_number"/>
<result property="mchId" column="mch_id"/>
<result property="mchDeptId" column="mch_dept_id"/>
<result property="createBy" column="create_by"/>
@@ -41,6 +42,7 @@
a.ks_status_title,
a.ks_comments,
a.hard_id,
a.hard_door_number,
a.mch_id,
a.mch_dept_id,
a.create_by,
@@ -7,6 +7,7 @@
<result property="userId" column="user_id"/>
<result property="hardId" column="hard_id"/>
<result property="spuId" column="spu_id"/>
<result property="beforeCount" column="before_count"/>
<result property="count" column="count"/>
<result property="bizType" column="biz_type"/>
<result property="createBy" column="create_by"/>
@@ -22,6 +23,7 @@
a.user_id,
a.hard_id,
a.spu_id,
a.before_count,
a.count,
a.biz_type,
a.create_by,
@@ -33,6 +35,7 @@
</sql>
<sql id="whereA">
a.del_flag = '0'
<if test="dto.hardId != null and dto.hardId != '' ">
and a.hard_id = #{dto.hardId}
</if>
@@ -55,7 +58,7 @@
<select id="scopePageJoin" resultType="com.bsd.pjcloud.hard.api.vo.spu.HardSpuRepertoryVo">
<include refid="selectA"/>
s.name,
s.name as spuName,
s.spu_category_id,
s.hard_door_number,
s.mch_id as spuMchId,
@@ -0,0 +1,65 @@
package com.bsd.pjcloud.thirdparty.api.feign;
import com.bsd.pjcloud.common.core.constant.ServiceNameConstants;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.feign.annotation.NoToken;
import com.bsd.pjcloud.thirdparty.dto.door.*;
import com.bsd.pjcloud.thirdparty.vo.door.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(contextId = "remoterThirdDoorApiService", value = ServiceNameConstants.THIRDPARTY_SERVICE)
public interface RemoterThirdDoorApiService {
/**
* 设备注册
*/
@NoToken
@PostMapping("/third-door/register")
R<DoorRegisterVo> register(@RequestBody DoorRegisterDto dto);
/**
* 设备信息绑定
*/
@NoToken
@PostMapping("/third-door/bind")
R<DoorBindVo> bind(@RequestBody DoorBindDto dto);
/**
* 查询设备状态
*/
@NoToken
@PostMapping("/third-door/status")
R<DoorStatusVo> status(@RequestBody DoorStatusDto dto);
/**
* 设备重启
*/
@NoToken
@PostMapping("/third-door/restart")
R<DoorRestartVo> restart(@RequestBody DoorRestartDto dto);
/**
* 音量设置
*/
@NoToken
@PostMapping("/third-door/volume")
R<DoorVolumeVo> volume(@RequestBody DoorVolumeDto dto);
/**
* 音量设置
*/
@NoToken
@PostMapping("/third-door/open")
R<DoorOpenVo> open(@RequestBody DoorOpenDto dto);
/**
* 音量设置
*/
@NoToken
@PostMapping("/third-door/video")
R<DoorVideoVo> video(@RequestBody DoorVideoDto dto);
}
@@ -7,7 +7,7 @@ import lombok.Getter;
import java.util.Arrays;
/**
* 打印状态
* 正元接口
*/
@AllArgsConstructor
@Getter
@@ -0,0 +1,26 @@
package com.bsd.pjcloud.thirdparty.constant.door;
import cn.hutool.core.util.ObjectUtil;
import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
@AllArgsConstructor
@Getter
public enum ThirdDoorApiTypeEnum {
DOOR_API("10", "智能柜接口"),
DISCERN_API("20", "识别接口"),
;
private final String type;
private final String description;
public static ThirdDoorApiTypeEnum valueOfByType(String type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
}
@@ -0,0 +1,37 @@
package com.bsd.pjcloud.thirdparty.constant.door;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 柜子接口
*/
@AllArgsConstructor
@Getter
public enum ThordDoorApiTypeEnum {
REGISTER("10", "设备注册"),
BIND("20", "设备信息绑定"),
STATUS("30", "查询设备状态"),
RESTART("40", "设备重启"),
SETTING("50", "设备设置"),
VOLUME("60", "音量设置"),
OPEN("70", "请求开锁"),
VIDEO("80", "调取另一个摄像头视频"),
OPEN_CALLBACK("90", "门锁开关通知"),
VIDEO_CALLBACK("100", "视频地址通知"),
STATUS_CALLBACK("110", "设备状态通知"),
;
private final String type;
private final String description;
public static ThordDoorApiTypeEnum valueOfByType(String type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
}
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorBindDto {
/**
* 设备编号
*/
private String deviceCode;
/**
* 设备 IMEI 号(15 位)
*/
private String imei;
/**
* 外部设备编号(由调用方系统自定义唯一编号)
*/
private String outDeviceCode;
}
@@ -0,0 +1,50 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorOpenCallbackDto {
/**
* OPEN:开锁通知;
* CLOSE:关锁通知;
*/
private String type;
/**
* 开门事件号
*/
private String eventId;
/**
* 1: 录制视频;4:不录制视频;5:检修开锁;6:检修关锁;
*/
private Integer eventType;
/**
* 商户自定义开门请求号(未开门的通知该字段为空)
*/
private String outOpenNo;
/**
* 设备编号
*/
private String deviceCode;
/**
* 货柜号(1,2)
*/
private Integer cabinetNo;
/**
* SUCCESS: 开锁成功;
* FAIL: 失败;
*/
private String resultCode;
/**
* 错误信息,resultCode=FAIL 时返回错误信息
*/
private String resultMsg;
}
@@ -0,0 +1,39 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorOpenDto {
/**
* 设备编号
*/
private String deviceCode;
/**
* 货柜号(1,2),单门柜填 1
*/
private int cabinetNo;
/**
* 商户自定义开门请求号(商户需要保证唯一)
*/
private String outOpenNo;
/**
* 1:录制视频;4:不录制视频;5:检修开锁;6:检修关锁
* 当锁状态异常无法开门时,可通过检修开锁、检修关锁重置锁状态
*/
private Integer eventType;
/**
* 开关门通知地址
*/
private String lockNotifyUrl;
/**
* 视频通知地址,视频上传成功后通过该地址通知 eventType 为 1 时必传
*/
private String videoNotifyUrl;
}
@@ -0,0 +1,18 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorRegisterDto {
/**
* 设备 IMEI 号(15 位)
*/
private String imei;
/**
* 外部设备编号(由调用方系统自定义唯一编号)
*/
private String outDeviceCode;
}
@@ -0,0 +1,20 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorRestartDto {
/**
* 设备编号
*/
private String deviceCode;
/**
* 重启模式。
* 3:系统软重启 安全重启空闲状态下响应处于购物中不响应
* 4:系统硬重启 不论什么状态直接重启
*/
private String restartType;
}
@@ -0,0 +1,13 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorStatusDto {
/**
* 设备编号
*/
private String deviceCode;
}
@@ -0,0 +1,60 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
import java.util.List;
@Data
public class DoorVideoCallbackDto {
/**
* 开门事件号
*/
private String eventId;
/**
* 商户自定义开门请求号(未开门的通知该字段为空)
*/
private String outOpenNo;
/**
* 设备编号
*/
private String deviceCode;
/**
* 货柜号(1,2)
*/
private Integer cabinetNo;
/**
* SUCCESS: 成功,videoList 有值。
* FAIL: 失败,videoList 为空。
* UNOPENED:未开门,videoList 为空。
*/
private String resultCode;
/**
* 错误信息,resultCode=FAIL 时返回错误信息
*/
private String resultMsg;
private List<DoorVideoCallbackDto.Video> videoList;
@Data
public class Video {
/**
* 摄像头号:1:主摄;2:辅摄
*/
private Integer cameraNo;
/**
* 视频地址
*/
private String videoUrl;
}
}
@@ -0,0 +1,13 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorVideoDto {
/**
* 开门事件号
*/
private String eventId;
}
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import lombok.Data;
@Data
public class DoorVolumeDto {
/**
* 设备编号
*/
private String deviceCode;
/**
* 系统音量
*/
private Integer systemVolume;
/**
* 媒体音量
*/
private Integer mediaVolume;
}
@@ -0,0 +1,13 @@
package com.bsd.pjcloud.thirdparty.dto.door;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ThirdDoorLogDto extends ThirdDoorLogEntity {
private LocalDateTime[] createTimeList;
}
@@ -0,0 +1,119 @@
package com.bsd.pjcloud.thirdparty.entity.door;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.bsd.pjcloud.common.core.util.TenantTable;
import java.time.LocalDateTime;
/**
* 智能柜日志
*/
@Data
@TenantTable
@TableName("third_door_log")
@EqualsAndHashCode(callSuper = true)
@Schema(description = "智能柜日志")
public class ThirdDoorLogEntity extends Model<ThirdDoorLogEntity> {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private Long id;
/**
* 请求类型
*/
@Schema(description = "请求类型")
private String apiType;
/**
* api类型
*/
@Schema(description = "api类型")
private String bizType;
/**
* api类型id
*/
@Schema(description = "api类型id")
private String bizId;
/**
* api url
*/
@Schema(description = "api url")
private String apiUrl;
/**
* res
*/
@Schema(description = "res")
private String res;
/**
* req
*/
@Schema(description = "req")
private String req;
/**
* 调用错误
*/
@Schema(description = "调用错误")
private String error;
/**
* 耗时(毫秒)
*/
@Schema(description = "耗时(毫秒)")
private String timeConsuming;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 更新人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新人")
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 删除时间
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除时间")
private String delFlag;
/**
* tenantId
*/
@Schema(description = "tenantId")
private Long tenantId;
}
@@ -0,0 +1,21 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
@Data
public class DoorBaseVo {
static private Integer successCode = 20000;
private Integer code;
private String message;
private Object data;
public boolean isSuccess() {
return ObjectUtil.equal(code, DoorBaseVo.successCode);
}
}
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorBindVo {
/**
* 设备编号
*/
private String deviceCode;
/**
* 设备 IMEI 号(15 位)
*/
private String imei;
/**
* 外部设备编号(由调用方系统自定义唯一编号)
*/
private String outDeviceCode;
}
@@ -0,0 +1,7 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorOpenCallbackVo {
}
@@ -0,0 +1,18 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorOpenVo {
/**
* 开门事件号
*/
private String eventId;
/**
* 商户自定义开门请求号
*/
private String outOpenNo;
}
@@ -0,0 +1,36 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorRegisterVo {
/**
* 设备编号
*/
private String deviceCode;
/**
* 设备 IMEI 号(15 位)
*/
private String imei;
/**
* 外部设备编号(由调用方系统自定义唯一编号)
*/
private String outDeviceCode;
/**
* 货柜数量
*/
private Integer cabinetNum;
/**
* 每个货柜中摄像头数量
*/
private Integer cabinetCameraNum;
/**
* 每个货柜中称重单元数量
*/
private Integer cabinetWeightUnitNum;
}
@@ -0,0 +1,8 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorRestartVo {
}
@@ -0,0 +1,94 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class DoorStatusVo {
/**
* 设备编号
*/
private String deviceCode;
/**
* 1:通电;2:断电
*/
private Integer powerStatus;
/**
* 在线状态,1:在线;2:离线
*/
private Integer netStatus;
/**
* 售卖状态。1:在售;2:停售
*/
private Integer saleStatus;
/**
* sim卡号设备有上报会返回,若一次上报都没有,则返回null。
*/
private String simSn;
/**
* sim 信号强度
* 大于-95 表示信号强度好
* -95 到-105 表示信号强度中等
* 小于-105 表示信号差
*/
private Integer signalIntensity;
/**
* 信噪比,体现信道传输质量的参数
* 大于 15 表示质量好
* 15 到 0 表示质量中等
* 小于等于 0 表示质量差
*/
private Integer signalRatio;
/**
* sim 信号值更新时间。yyyy-MM-dd HH:mm:ss
*/
private LocalDateTime signalTime;
/**
* 货柜列表
*/
private List<Cabinet> cabinetList;
@Data
public class Cabinet {
/**
* 货柜号(1,2)
*/
private Integer cabinetNo;
/**
* 锁在线1:在线;2:离线
*/
private Integer isLockOnline;
/**
* 锁状态1:锁关;2:锁开
*/
private Integer lockStatus;
/**
* 门状态1:门关;2:门开
*/
private Integer doorStatus;
/**
* 货柜售卖状态1:在售;2:停售
*/
private Integer saleStatus;
}
}
@@ -0,0 +1,7 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorVideoCallbackVo {
}
@@ -0,0 +1,8 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorVideoVo {
}
@@ -0,0 +1,7 @@
package com.bsd.pjcloud.thirdparty.vo.door;
import lombok.Data;
@Data
public class DoorVolumeVo {
}
@@ -1,2 +1,3 @@
com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdDoorApiService
com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdPartyAuthService
com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdZyService
@@ -0,0 +1,17 @@
package com.bsd.pjcloud.thirdparty.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "door")
@Data
public class DoorConfig {
private String baseUrl;
private String appId;
private String selfBaseUrl;
}
@@ -0,0 +1,108 @@
package com.bsd.pjcloud.thirdparty.controller.door;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.thirdparty.dto.door.*;
import com.bsd.pjcloud.thirdparty.service.ThirdDoorApiService;
import com.bsd.pjcloud.thirdparty.vo.door.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
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
@RequiredArgsConstructor
@RequestMapping("/third-door")
@Tag(description = "third-door", name = "智能柜")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class ThirdDoorApiController {
private final ThirdDoorApiService thirdDoorApiService;
/* ************************************* start 远程调用 start ************************************* */
@Inner
@Operation(summary = "设备注册")
@PostMapping("/register")
public R<DoorRegisterVo> register(@RequestBody DoorRegisterDto dto) {
return R.ok(thirdDoorApiService.register(dto));
}
@Inner
@Operation(summary = "设备信息绑定")
@PostMapping("/bind")
public R<DoorBindVo> bind(@RequestBody DoorBindDto dto) {
return R.ok(thirdDoorApiService.bind(dto));
}
@Inner
@Operation(summary = "查询设备状态")
@PostMapping("/status")
public R<DoorStatusVo> status(@RequestBody DoorStatusDto dto) {
return R.ok(thirdDoorApiService.status(dto));
}
@Inner
@Operation(summary = "设备重启")
@PostMapping("/restart")
public R<DoorRestartVo> restart(@RequestBody DoorRestartDto dto) {
return R.ok(thirdDoorApiService.restart(dto));
}
@Inner
@Operation(summary = "音量设置")
@PostMapping("/volume")
public R<DoorVolumeVo> volume(@RequestBody DoorVolumeDto dto) {
return R.ok(thirdDoorApiService.volume(dto));
}
@Inner
@Operation(summary = "请求开锁")
@PostMapping("/open")
public R<DoorOpenVo> open(@RequestBody DoorOpenDto dto) {
return R.ok(thirdDoorApiService.open(dto));
}
@Inner
@Operation(summary = "调取另一个摄像头视频")
@PostMapping("/video")
public R<DoorVideoVo> video(@RequestBody DoorVideoDto dto) {
return R.ok(thirdDoorApiService.video(dto));
}
/* ************************************* end 远程调用 end ************************************* */
/* ************************************* start 回调 start ************************************* */
@Inner(value = false)
@Operation(summary = "门锁开关通知回调")
@PostMapping("/callback/open")
public R<DoorOpenCallbackVo> callbackOpen(@RequestBody DoorOpenCallbackDto dto) {
return R.ok(thirdDoorApiService.callbackOpen(dto));
}
@Inner(value = false)
@Operation(summary = "视频地址通知回调")
@PostMapping("/callback/open")
public R<DoorVideoCallbackVo> callbackVideo(@RequestBody DoorVideoCallbackDto dto) {
return R.ok(thirdDoorApiService.callbackVideo(dto));
}
@Inner(value = false)
@Operation(summary = "设备状态通知回调")
@PostMapping("/callback/open")
public R<DoorStatusVo> callbackStatus(@RequestBody DoorStatusDto dto) {
return R.ok(thirdDoorApiService.callbackStatus(dto));
}
/* ************************************* start 回调 start ************************************* */
}
@@ -0,0 +1,84 @@
package com.bsd.pjcloud.thirdparty.controller.door;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.thirdparty.dto.door.ThirdDoorLogDto;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import com.bsd.pjcloud.thirdparty.service.ThirdDoorLogService;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
* 智能柜日志
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/third-door-log")
@Tag(description = "third-door-log", name = "智能柜日志管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class ThirdDoorLogController {
private final ThirdDoorLogService thirdDoorLogService;
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@PreAuthorize("@pms.hasPermission('third_thirdDoorLog_view')")
public R getThirdDoorLogPage(@ParameterObject Page page, @ParameterObject ThirdDoorLogDto dto) {
DataScope dataScope = null;
return R.ok(thirdDoorLogService.scopePageList(page, dto, dataScope));
}
@Operation(summary = "通过id查询", description = "通过id查询")
@GetMapping("/{id}")
@PreAuthorize("@pms.hasPermission('third_thirdDoorLog_view')")
public R getById(@PathVariable("id") Long id) {
return R.ok(thirdDoorLogService.getById(id));
}
@Operation(summary = "新增智能柜日志", description = "新增智能柜日志")
@SysLog("新增智能柜日志")
@PostMapping
@PreAuthorize("@pms.hasPermission('third_thirdDoorLog_add')")
public R save(@RequestBody ThirdDoorLogEntity thirdDoorLog) {
return R.ok(thirdDoorLogService.save(thirdDoorLog));
}
@Operation(summary = "修改智能柜日志", description = "修改智能柜日志")
@SysLog("修改智能柜日志")
@PutMapping
@PreAuthorize("@pms.hasPermission('third_thirdDoorLog_edit')")
public R updateById(@RequestBody ThirdDoorLogEntity thirdDoorLog) {
return R.ok(thirdDoorLogService.updateById(thirdDoorLog));
}
@Operation(summary = "通过id删除智能柜日志", description = "通过id删除智能柜日志")
@SysLog("通过id删除智能柜日志")
@DeleteMapping
@PreAuthorize("@pms.hasPermission('third_thirdDoorLog_del')")
public R removeById(@RequestBody Long[] ids) {
return R.ok(thirdDoorLogService.removeBatchByIds(CollUtil.toList(ids)));
}
@ResponseExcel
@GetMapping("/export")
@PreAuthorize("@pms.hasPermission('third_thirdDoorLog_export')")
public List<ThirdDoorLogEntity> export(ThirdDoorLogEntity thirdDoorLog, Long[] ids) {
return thirdDoorLogService.list(Wrappers.lambdaQuery(thirdDoorLog).in(ArrayUtil.isNotEmpty(ids), ThirdDoorLogEntity::getId, ids));
}
}
@@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.controller.zy;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyForeignService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyForeignService;
import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignSyncNativeCardTradeInfoVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -2,13 +2,11 @@ package com.bsd.pjcloud.thirdparty.controller.zy;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccClassInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccountInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncDealerInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncEnterpriseInfoDto;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyMerService;
import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignSyncNativeCardTradeInfoVo;
import com.bsd.pjcloud.thirdparty.service.ThirdZyMerService;
import com.bsd.pjcloud.thirdparty.vo.zy.mer.ZyMerSyncAccClassInfoVo;
import com.bsd.pjcloud.thirdparty.vo.zy.mer.ZyMerSyncAccountInfoVo;
import com.bsd.pjcloud.thirdparty.vo.zy.mer.ZyMerSyncDealerInfoVo;
@@ -1,14 +1,11 @@
package com.bsd.pjcloud.thirdparty.controller.zy;
import com.bsd.pjcloud.common.idempotent.annotation.Idempotent;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfCorrectDto;
import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfGetTokenDto;
import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfPayDto;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZySelfService;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfCorrectVo;
import com.bsd.pjcloud.thirdparty.service.ThirdZySelfService;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfGetTokenVo;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfPayVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@@ -5,7 +5,7 @@ import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideAuthenticationDto;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideConsumptionDto;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideCorrectDto;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyStrideService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyStrideService;
import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideAuthenticationVo;
import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideConsumptionVo;
import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideCorrectVo;
@@ -0,0 +1,30 @@
package com.bsd.pjcloud.thirdparty.mapper.door;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.thirdparty.dto.door.ThirdDoorLogDto;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ThirdDoorLogMapper extends PjcloudBaseMapper<ThirdDoorLogEntity> {
default Page<ThirdDoorLogEntity> scopePageList(Page page, ThirdDoorLogDto dto, DataScope dataScope) {
LambdaQueryWrapper<ThirdDoorLogEntity> wrapper = new LambdaQueryWrapper<ThirdDoorLogEntity>()
.eq(ObjectUtil.isNotEmpty(dto.getApiType()), ThirdDoorLogEntity::getApiType, dto.getApiType())
.eq(ObjectUtil.isNotEmpty(dto.getBizId()), ThirdDoorLogEntity::getBizId, dto.getBizId())
.eq(ObjectUtil.isNotEmpty(dto.getBizType()), ThirdDoorLogEntity::getBizType, dto.getBizType())
.between(
ObjectUtil.isNotEmpty(dto.getCreateTimeList()),
ThirdDoorLogEntity::getCreateTime,
ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[0] : null,
ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[1] : null
)
.orderByDesc(ThirdDoorLogEntity::getCreateTime)
.orderByDesc(ThirdDoorLogEntity::getId);
return selectPageByScope(page, wrapper, dataScope);
}
}
@@ -0,0 +1,58 @@
package com.bsd.pjcloud.thirdparty.service;
import com.bsd.pjcloud.thirdparty.dto.door.*;
import com.bsd.pjcloud.thirdparty.vo.door.*;
public interface ThirdDoorApiService {
/**
* 设备注册
*/
DoorRegisterVo register(DoorRegisterDto dto);
/**
* 设备信息绑定
*/
DoorBindVo bind(DoorBindDto dto);
/**
* 查询设备状态
*/
DoorStatusVo status(DoorStatusDto dto);
/**
* 设备重启
*/
DoorRestartVo restart(DoorRestartDto dto);
/**
* 音量设置
*/
DoorVolumeVo volume(DoorVolumeDto dto);
/**
* 请求开锁
*/
DoorOpenVo open(DoorOpenDto dto);
/**
* 调取另一个摄像头视频
*/
DoorVideoVo video(DoorVideoDto dto);
/**
* 门锁开关通知回调
*/
DoorOpenCallbackVo callbackOpen(DoorOpenCallbackDto dto);
/**
* 视频地址通知回调
*/
DoorVideoCallbackVo callbackVideo(DoorVideoCallbackDto dto);
/**
* 设备状态通知回调
*/
DoorStatusVo callbackStatus(DoorStatusDto dto);
}
@@ -0,0 +1,14 @@
package com.bsd.pjcloud.thirdparty.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.thirdparty.dto.door.ThirdDoorLogDto;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import java.util.List;
public interface ThirdDoorLogService extends IService<ThirdDoorLogEntity> {
Page<ThirdDoorLogEntity> scopePageList(Page page, ThirdDoorLogDto dto, DataScope dataScope);
}
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.thirdparty.service.impl;
package com.bsd.pjcloud.thirdparty.service;
import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto;
import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignGetRegionIdByTokenVo;
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.thirdparty.service.impl;
package com.bsd.pjcloud.thirdparty.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity;
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.thirdparty.service.impl;
package com.bsd.pjcloud.thirdparty.service;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccClassInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccountInfoDto;
@@ -1,11 +1,9 @@
package com.bsd.pjcloud.thirdparty.service.impl;
package com.bsd.pjcloud.thirdparty.service;
import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfCorrectDto;
import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfGetTokenDto;
import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfPayDto;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfCorrectVo;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfGetTokenVo;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfPayVo;
import java.util.Map;
@@ -1,4 +1,4 @@
package com.bsd.pjcloud.thirdparty.service.impl;
package com.bsd.pjcloud.thirdparty.service;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideAuthenticationDto;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideConsumptionDto;
@@ -0,0 +1,151 @@
package com.bsd.pjcloud.thirdparty.service.impl.door;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.thirdparty.dto.door.*;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import com.bsd.pjcloud.thirdparty.service.ThirdDoorApiService;
import com.bsd.pjcloud.thirdparty.service.ThirdDoorLogService;
import com.bsd.pjcloud.thirdparty.utils.door.api.DoorApi;
import com.bsd.pjcloud.thirdparty.vo.door.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.Arrays;
@Service
@Validated
@Slf4j
@RequiredArgsConstructor
public class ThirdDoorApiServiceImpl implements ThirdDoorApiService {
private final String TAG = "智能柜api";
private final ThirdDoorLogService doorLogService;
/**
* 设备注册
*/
@Override
public DoorRegisterVo register(DoorRegisterDto dto) {
long startTime = System.currentTimeMillis();
DoorApi.Api registerApi = DoorApi.REGISTER;
ThirdDoorLogEntity logEntity = registerApi.getInitLogEntity();
logEntity.setReq(JSONUtil.toJsonStr(dto));
try {
String body = JSONUtil.toJsonStr(dto);
String res = registerApi.getHttpRequest().body(body).execute().body();
if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空");
logEntity.setRes(res);
DoorBaseVo doorBaseVo = JSONUtil.toBean(res, DoorBaseVo.class);
if (!doorBaseVo.isSuccess()) {
throw new RuntimeException(String.format("请求错误res|%s|url|%s|body|%s|", res, registerApi, body));
}
return JSONUtil.toBean(res, DoorRegisterVo.class);
} catch (Exception e) {
String error = String.format("|%s||register|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
log.error(error);
logEntity.setError(error);
} finally {
logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
doorLogService.save(logEntity);
}
return null;
}
/**
* 设备信息绑定
*/
@Override
public DoorBindVo bind(DoorBindDto dto) {
long startTime = System.currentTimeMillis();
DoorApi.Api registerApi = DoorApi.REGISTER;
ThirdDoorLogEntity logEntity = registerApi.getInitLogEntity();
logEntity.setReq(JSONUtil.toJsonStr(dto));
try {
String body = JSONUtil.toJsonStr(dto);
String res = registerApi.getHttpRequest().body(body).execute().body();
if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空");
logEntity.setRes(res);
DoorBaseVo doorBaseVo = JSONUtil.toBean(res, DoorBaseVo.class);
if (!doorBaseVo.isSuccess()) {
throw new RuntimeException(String.format("请求错误res|%s|url|%s|body|%s|", res, registerApi, body));
}
return JSONUtil.toBean(res, DoorBindVo.class);
} catch (Exception e) {
String error = String.format("|%s||bind|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace()));
log.error(error);
logEntity.setError(error);
} finally {
logEntity.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime));
doorLogService.save(logEntity);
}
return null;
}
/**
* 查询设备状态
*/
@Override
public DoorStatusVo status(DoorStatusDto dto) {
return null;
}
/**
* 设备重启
*/
@Override
public DoorRestartVo restart(DoorRestartDto dto) {
return null;
}
/**
* 音量设置
*/
@Override
public DoorVolumeVo volume(DoorVolumeDto dto) {
return null;
}
/**
* 请求开锁
*/
@Override
public DoorOpenVo open(DoorOpenDto dto) {
return null;
}
/**
* 调取另一个摄像头视频
*/
@Override
public DoorVideoVo video(DoorVideoDto dto) {
return null;
}
/**
* 门锁开关通知回调
*/
@Override
public DoorOpenCallbackVo callbackOpen(DoorOpenCallbackDto dto) {
return null;
}
/**
* 视频地址通知回调
*/
@Override
public DoorVideoCallbackVo callbackVideo(DoorVideoCallbackDto dto) {
return null;
}
/**
* 设备状态通知回调
*/
@Override
public DoorStatusVo callbackStatus(DoorStatusDto dto) {
return null;
}
}
@@ -0,0 +1,23 @@
package com.bsd.pjcloud.thirdparty.service.impl.door;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.thirdparty.dto.door.ThirdDoorLogDto;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import com.bsd.pjcloud.thirdparty.mapper.door.ThirdDoorLogMapper;
import com.bsd.pjcloud.thirdparty.service.ThirdDoorLogService;
import org.springframework.stereotype.Service;
/**
* 智能柜日志
*/
@Service
public class ThirdDoorLogServiceImpl extends ServiceImpl<ThirdDoorLogMapper, ThirdDoorLogEntity> implements ThirdDoorLogService {
@Override
public Page<ThirdDoorLogEntity> scopePageList(Page page, ThirdDoorLogDto dto, DataScope dataScope) {
return baseMapper.scopePageList(page, dto, dataScope);
}
}
@@ -10,7 +10,7 @@ import com.bsd.pjcloud.thirdparty.config.ZyConfig;
import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType;
import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyLogEntity;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyForeignService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyForeignService;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApi;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool;
import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseEncryptVo;
@@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.service.impl.zy;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity;
import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyIdDictService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyIdDictService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -1,6 +1,5 @@
package com.bsd.pjcloud.thirdparty.service.impl.zy;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
@@ -11,7 +10,7 @@ import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccountInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncDealerInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncEnterpriseInfoDto;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyLogEntity;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyMerService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyMerService;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApi;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool;
import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseEncryptVo;
@@ -3,7 +3,6 @@ package com.bsd.pjcloud.thirdparty.service.impl.zy;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.IdUtil;
@@ -11,8 +10,6 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.common.core.constant.CacheConstants;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.hard.api.constant.third.HardCallbackRefundStatus;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto;
import com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService;
@@ -27,11 +24,10 @@ import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfTokenDto;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyLogEntity;
import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZySelfService;
import com.bsd.pjcloud.thirdparty.service.ThirdZySelfService;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApi;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool;
import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseVo;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfCorrectVo;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfGetTokenVo;
import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfPayVo;
import io.jsonwebtoken.Claims;
@@ -8,7 +8,7 @@ import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideAuthenticationDto;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideConsumptionDto;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideCorrectDto;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyLogEntity;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyStrideService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyStrideService;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApi;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool;
import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideAuthenticationVo;
@@ -0,0 +1,84 @@
package com.bsd.pjcloud.thirdparty.utils.door.api;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import com.bsd.pjcloud.thirdparty.constant.door.ThirdDoorApiTypeEnum;
import com.bsd.pjcloud.thirdparty.constant.door.ThordDoorApiTypeEnum;
import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
public class DoorApi {
// 设备注册
public static final Api REGISTER = Api.builder().url("/ams/api/device/register").bizType(ThordDoorApiTypeEnum.REGISTER).method("post").contentType("application/json").build();
// 设备信息绑定
public static final Api BIND = Api.builder().url("/ams/api/device/bind").bizType(ThordDoorApiTypeEnum.BIND).method("post").contentType("application/json").build();
// 查询设备状态
public static final Api STATUS = Api.builder().url("/ams/api/device/status").bizType(ThordDoorApiTypeEnum.STATUS).method("post").contentType("application/json").build();
// 设备重启
public static final Api RESTART = Api.builder().url("/ams/api/device/restart").bizType(ThordDoorApiTypeEnum.RESTART).method("post").contentType("application/json").build();
// 设备设置
public static final Api SETTING = Api.builder().url("/ams/api/device/setting").bizType(ThordDoorApiTypeEnum.SETTING).method("post").contentType("application/json").build();
// 音量设置
public static final Api VOLUME = Api.builder().url("/ams/api/device/volume").bizType(ThordDoorApiTypeEnum.VOLUME).method("post").contentType("application/json").build();
// 请求开锁
public static final Api OPEN = Api.builder().url("/ams/api/event/open").bizType(ThordDoorApiTypeEnum.OPEN).method("post").contentType("application/json").build();
// 调取另一个摄像头视频
public static final Api VIDEO = Api.builder().url("/ams/api/event/video").bizType(ThordDoorApiTypeEnum.VIDEO).method("post").contentType("application/json").build();
// 门锁开关通知
public static final Api OPEN_CALLBACK = Api.builder().url("/door/callback/open").bizType(ThordDoorApiTypeEnum.OPEN_CALLBACK).method("post").contentType("application/json").build();
// 视频地址通知
public static final Api VIDEO_CALLBACK = Api.builder().url("/door/callback/video").bizType(ThordDoorApiTypeEnum.VIDEO_CALLBACK).method("post").contentType("application/json").build();
// 设备状态通知
public static final Api STATUS_CALLBACK = Api.builder().url("/door/callback/status").bizType(ThordDoorApiTypeEnum.STATUS_CALLBACK).method("post").contentType("application/json").build();
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class Api {
private String url;
private String method;
private String contentType;
private ThirdDoorApiTypeEnum apiType = ThirdDoorApiTypeEnum.DOOR_API;
private ThordDoorApiTypeEnum bizType;
public HttpRequest getHttpRequest() {
if (ObjectUtil.equals(method, "post")) {
return HttpRequest.post(url).contentType(contentType);
} else if (ObjectUtil.equals(method, "get")) {
return HttpRequest.get(url).contentType(contentType);
} else {
return null;
}
}
public ThirdDoorLogEntity getInitLogEntity() {
ThirdDoorLogEntity entity = new ThirdDoorLogEntity();
entity.setBizId(null);
entity.setBizType(bizType.getType());
entity.setApiType(apiType.getType());
entity.setApiUrl(url);
return entity;
}
}
}
@@ -68,4 +68,13 @@ zy:
# token key
# self_token_key: zy_token
# token
# self_token_secret: eV3dT0oD7iX8rK4eC3jS6fU8cU5cS6mJ
# self_token_secret: eV3dT0oD7iX8rK4eC3jS6fU8cU5cS6mJ
# 智能柜
door:
base-url: https://www.365e-life.net:8443/bkopenapi
app-id:
self-base-url:
# 旷世识别
@@ -0,0 +1,23 @@
<?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.bsd.pjcloud.thirdparty.mapper.door.ThirdDoorLogMapper">
<resultMap id="thirdDoorLogMap" type="com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity">
<id property="id" column="id"/>
<result property="apiType" column="api_type"/>
<result property="bizType" column="biz_type"/>
<result property="bizId" column="biz_id"/>
<result property="apiUrl" column="api_url"/>
<result property="res" column="res"/>
<result property="req" column="req"/>
<result property="error" column="error"/>
<result property="timeConsuming" column="time_consuming"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
</mapper>
@@ -21,10 +21,10 @@ import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideConsumptionDto;
import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideCorrectDto;
import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity;
import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyForeignService;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyMerService;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZySelfService;
import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyStrideService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyForeignService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyMerService;
import com.bsd.pjcloud.thirdparty.service.ThirdZySelfService;
import com.bsd.pjcloud.thirdparty.service.ThirdZyStrideService;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool;
import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignGetRegionIdByTokenVo;
import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignSyncNativeCardTradeInfoVo;
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.admin.utils.excel;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ooxml.POIXMLDocumentPart;
@@ -20,6 +21,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@UtilityClass
public class ExcelTool {
@@ -52,15 +54,19 @@ public class ExcelTool {
*/
public static Map<String, PictureData> getPictures(HSSFSheet sheet) throws IOException {
Map<String, PictureData> map = new HashMap<String, PictureData>();
List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
for (HSSFShape shape : list) {
if (shape instanceof HSSFPicture) {
HSSFPicture picture = (HSSFPicture) shape;
HSSFClientAnchor cAnchor = picture.getClientAnchor();
PictureData pdata = picture.getPictureData();
String key = String.valueOf(cAnchor.getRow1());
map.put(key, pdata);
try {
List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
for (HSSFShape shape : list) {
if (shape instanceof HSSFPicture) {
HSSFPicture picture = (HSSFPicture) shape;
HSSFClientAnchor cAnchor = picture.getClientAnchor();
PictureData pdata = picture.getPictureData();
String key = String.valueOf(cAnchor.getRow1());
map.put(key, pdata);
}
}
} catch (Exception e) {
log.error("getPictures 读取图片错误", e);
}
return map;
}
@@ -50,4 +50,13 @@ public class WalletManageVo extends WalletManageEntity implements BaseUserInterf
*/
private LocalDateTime lastTopUpTime;
/**
* 导出相关
*/
private String balanceStr;
private String totalExpenseStr;
private String totalRechargeStr;
}
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto;
import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity;
import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity;
@@ -65,9 +66,15 @@ public interface WalletRechargeApplyMapper extends PjcloudBaseMapper<WalletRecha
WalletRechargeApplyEntity::getProcessTime,
ObjectUtil.isNotEmpty(dto.getProcessTimeList()) ? dto.getProcessTimeList()[0] : null,
ObjectUtil.isNotEmpty(dto.getProcessTimeList()) ? dto.getProcessTimeList()[1] : null
)
.orderByDesc(WalletRechargeApplyEntity::getCreateTime)
.orderByDesc(WalletRechargeApplyEntity::getId);
);
if (ObjectUtil.equals(dto.getProcessStatus(), TaskCheckStatusEnum.RESULT.getCode())) {
wrapper.orderByDesc(WalletRechargeApplyEntity::getProcessTime)
.orderByDesc(WalletRechargeApplyEntity::getId);
} else {
wrapper.orderByDesc(WalletRechargeApplyEntity::getCreateTime)
.orderByDesc(WalletRechargeApplyEntity::getId);
}
Page list = selectPageByScope(page, wrapper, DataScope.of());
list.setRecords(BeanUtils.toBean(list.getRecords(), WalletRechargeApplyVo.class));
return list;
@@ -344,11 +344,11 @@ public class WalletManageServiceImpl extends ServiceImpl<WalletManageMapper, Wal
List<WalletManageBalanceVo> itemList = baseMapper.selectBalance(dto);
if (ObjectUtil.isEmpty(itemList)) continue;
for (WalletManageBalanceVo j : itemList) {
j.setWalletTypeName(i.getName());
walletList.stream().filter(v -> ObjectUtil.equals(v.getUserId(), j.getUserId())).findFirst().ifPresent(v -> {
walletList.stream().filter(v -> ObjectUtil.equals(i.getId(), v.getWalletTypeId()) && ObjectUtil.equals(v.getUserId(), j.getUserId())).findFirst().ifPresent(v -> {
if (ObjectUtil.isNotEmpty(j.getBalance())) {
v.setBalance(j.getBalance());
v.setLastTopUpTime(j.getCreateTime());
v.setWalletTypeName(i.getName());
}
});
}
@@ -380,15 +380,15 @@ public class WalletManageServiceImpl extends ServiceImpl<WalletManageMapper, Wal
lineNumber++;
if (ObjectUtil.isNotEmpty(v.getBalance())) {
balanceSum = balanceSum.add(BigDecimal.valueOf(v.getBalance()));
v.setBalance(BigDecimal.valueOf(v.getBalance()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).intValue());
v.setBalanceStr(BigDecimal.valueOf(v.getBalance()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString());
}
if (ObjectUtil.isNotEmpty(v.getTotalExpense())) {
totalExpenseSum = totalExpenseSum.add(BigDecimal.valueOf(v.getTotalExpense()));
v.setTotalExpense(BigDecimal.valueOf(v.getTotalExpense()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).intValue());
v.setTotalExpenseStr(BigDecimal.valueOf(v.getTotalExpense()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString());
}
if (ObjectUtil.isNotEmpty(v.getTotalRecharge())) {
totalRechargeSum = totalRechargeSum.add(BigDecimal.valueOf(v.getTotalRecharge()));
v.setTotalRecharge(BigDecimal.valueOf(v.getTotalRecharge()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).intValue());
v.setTotalRechargeStr(BigDecimal.valueOf(v.getTotalRecharge()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString());
}
}
map.put("balanceSum", balanceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString());
@@ -420,7 +420,7 @@ public class WalletManageServiceImpl extends ServiceImpl<WalletManageMapper, Wal
lineNumber++;
if (ObjectUtil.isNotEmpty(v.getBalance())) {
balanceSum = balanceSum.add(BigDecimal.valueOf(v.getBalance()));
v.setBalance(BigDecimal.valueOf(v.getBalance()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).intValue());
v.setBalanceStr(BigDecimal.valueOf(v.getBalance()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString());
}
}
map.put("balanceSum", balanceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString());
@@ -58,8 +58,25 @@
<where>
a.del_flag = 0
<if test="dto.walletRecordMonth != null">
AND a.create_time = (SELECT MAX(sub.create_time) FROM wallet_transaction sub WHERE sub.user_id = a.user_id AND
DATE_FORMAT(sub.create_time, '%Y-%m') &lt;= #{dto.walletRecordMonth})
AND a.create_time = (
SELECT MAX(sub.create_time)
FROM wallet_transaction sub
LEFT JOIN wallet_manage wallet on wallet.id = sub.wallet_id
WHERE sub.user_id = a.user_id
AND DATE_FORMAT(sub.create_time, '%Y-%m') &lt;= #{dto.walletRecordMonth}
<if test="dto.userId != null">
AND sub.user_id = #{dto.userId}
</if>
<if test="dto.userIds != null and dto.userIds.size() != 0">
and sub.user_id in
<foreach collection="dto.userIds" item="v" open="(" close=")" separator=",">
#{v}
</foreach>
</if>
<if test="dto.walletTypeId != null">
AND wallet.wallet_type_id = #{dto.walletTypeId}
</if>
)
</if>
<if test="dto.userId != null">
AND a.user_id = #{dto.userId}