我的任务优化、工程量清单优化、gps消息websocket连接、物资管理:物资验收入库添加附件

This commit is contained in:
2025-09-10 19:38:10 +08:00
parent 7dd6d97a3e
commit 056b28af31
26 changed files with 198 additions and 17 deletions

View File

@ -12,6 +12,8 @@ public interface WebSocketConstants {
*/ */
String LOGIN_USER_KEY = "loginUser"; String LOGIN_USER_KEY = "loginUser";
String PROJECT_ID = "projectId";
/** /**
* 订阅的频道 * 订阅的频道
*/ */

View File

@ -13,6 +13,7 @@ import java.io.IOException;
import java.util.List; import java.util.List;
import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY;
import static org.dromara.common.websocket.constant.WebSocketConstants.PROJECT_ID;
/** /**
* WebSocketHandler 实现类 * WebSocketHandler 实现类
@ -27,14 +28,17 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
*/ */
@Override @Override
public void afterConnectionEstablished(WebSocketSession session) throws IOException { public void afterConnectionEstablished(WebSocketSession session) throws IOException {
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); // LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
if (ObjectUtil.isNull(loginUser)) { Long loginUser = (Long) session.getAttributes().get(PROJECT_ID);
// if (ObjectUtil.isNull(loginUser) ) {
if (loginUser == null ) {
session.close(CloseStatus.BAD_DATA); session.close(CloseStatus.BAD_DATA);
log.info("[connect] invalid token received. sessionId: {}", session.getId()); log.info("[connect] invalid token received. sessionId: {}", session.getId());
return; return;
} }
WebSocketSessionHolder.addSession(loginUser.getUserId(), session); WebSocketSessionHolder.addSession(loginUser, session);
log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); // WebSocketSessionHolder.addSession(loginUser.getUserId(), session);
// log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
} }
/** /**
@ -47,11 +51,13 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
@Override @Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
// 从WebSocket会话中获取登录用户信息 // 从WebSocket会话中获取登录用户信息
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); // LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
Long loginUser = (Long) session.getAttributes().get(PROJECT_ID);
// 创建WebSocket消息DTO对象 // 创建WebSocket消息DTO对象
WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto(); WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto();
webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId())); // webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId()));
webSocketMessageDto.setSessionKeys(List.of(loginUser));
webSocketMessageDto.setMessage(message.getPayload()); webSocketMessageDto.setMessage(message.getPayload());
WebSocketUtils.publishMessage(webSocketMessageDto); WebSocketUtils.publishMessage(webSocketMessageDto);
} }
@ -100,13 +106,16 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
*/ */
@Override @Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); // LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
if (ObjectUtil.isNull(loginUser)) { Long loginUser = (Long) session.getAttributes().get(PROJECT_ID);
// if (ObjectUtil.isNull(loginUser)) {
if (loginUser != null ) {
log.info("[disconnect] invalid token received. sessionId: {}", session.getId()); log.info("[disconnect] invalid token received. sessionId: {}", session.getId());
return; return;
} }
WebSocketSessionHolder.removeSession(loginUser.getUserId()); // WebSocketSessionHolder.removeSession(loginUser.getUserId());
log.info("[disconnect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); WebSocketSessionHolder.removeSession(loginUser);
// log.info("[disconnect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType());
} }
/** /**

View File

@ -15,6 +15,7 @@ import org.springframework.web.socket.server.HandshakeInterceptor;
import java.util.Map; import java.util.Map;
import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY;
import static org.dromara.common.websocket.constant.WebSocketConstants.PROJECT_ID;
/** /**
* WebSocket握手请求的拦截器 * WebSocket握手请求的拦截器
@ -44,6 +45,8 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
String projectIdStr = ServletUtils.getRequest().getParameter("projectId");
Long projectId = Long.parseLong(projectIdStr);
if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
// token 无效 // token 无效
throw NotLoginException.newInstance(StpUtil.getLoginType(), throw NotLoginException.newInstance(StpUtil.getLoginType(),
@ -52,6 +55,7 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
} }
attributes.put(LOGIN_USER_KEY, loginUser); attributes.put(LOGIN_USER_KEY, loginUser);
attributes.put(PROJECT_ID,projectId);
return true; return true;
} catch (NotLoginException e) { } catch (NotLoginException e) {
log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage()); log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage());

View File

@ -42,6 +42,14 @@ public class BusBiddingLimitVersions extends BaseEntity {
*/ */
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* excel文件 * excel文件
*/ */

View File

@ -44,6 +44,14 @@ public class BusBiddingLimitVersionsBo extends BaseEntity {
@NotBlank(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class }) @NotBlank(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class })
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* excel文件 * excel文件
*/ */

View File

@ -52,6 +52,14 @@ public class BusBiddingLimitVersionsVo implements Serializable {
@ExcelProperty(value = "版本号") @ExcelProperty(value = "版本号")
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* excel文件 * excel文件
*/ */

View File

@ -40,6 +40,11 @@ public class BusBillofquantitiesVersions extends BaseEntity {
*/ */
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* exlce文件 * exlce文件
*/ */

View File

@ -39,4 +39,11 @@ public class BusBillofquantitiesVersionsBo extends BaseEntity {
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
} }

View File

@ -48,6 +48,13 @@ public class BusBillofquantitiesVersionsVo implements Serializable {
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* Excel文件 * Excel文件
*/ */

View File

@ -191,8 +191,22 @@ public class BusBillofquantitiesVersionsServiceImpl extends ServiceImpl<BusBillo
throw new ServiceException("上传文件失败"); throw new ServiceException("上传文件失败");
} }
String banBen = BatchNumberGenerator.generateBatchNumber("GCLBB-"); String banBen = BatchNumberGenerator.generateBatchNumber("GCLBB-");
String[] split = StringUtils.split(wordEntity.getFileName(),".xlsx");
String vName = "";
switch (bo.getWorkOrderType()){
case "0":
vName = "投标工程量清单-"+split[0];
case "1":
vName = "限价工程量清单-"+split[0];
case "2":
vName = "招采工程量清单-"+split[0];
case "3":
vName = "物资设备清单-"+split[0];
}
int insert = baseMapper.insert(new BusBillofquantitiesVersions(). int insert = baseMapper.insert(new BusBillofquantitiesVersions().
setWorkOrderType(bo.getWorkOrderType()). setWorkOrderType(bo.getWorkOrderType()).
setVersionsName(vName).
setVersions(banBen). setVersions(banBen).
setProjectId(bo.getProjectId()). setProjectId(bo.getProjectId()).
setExcelFile(wordEntity.getUrl())); setExcelFile(wordEntity.getUrl()));

View File

@ -57,6 +57,19 @@ public class GpsEquipmentController extends BaseController {
private final IBusProjectService projectService; private final IBusProjectService projectService;
/**
* 接收设备数据
* @param jsonData
* @return
*/
@PostMapping("/setData")
public R<Void> setData(@RequestBody String jsonData) {
log.info("接收设备数据:{}", jsonData);
gpsEquipmentService.setData(jsonData);
return toAjax(true);
}
/** /**
* 接收设备数据 * 接收设备数据
* @param jsonData * @param jsonData

View File

@ -97,4 +97,6 @@ public interface IGpsEquipmentService extends IService<GpsEquipment>{
List<GpsProjectVo> getProjectList(); List<GpsProjectVo> getProjectList();
List<GpsEquipmentSonVo> getClientList(Long projectId); List<GpsEquipmentSonVo> getClientList(Long projectId);
void setData(String jsonData);
} }

View File

@ -434,5 +434,18 @@ public class GpsEquipmentServiceImpl extends ServiceImpl<GpsEquipmentMapper, Gps
return gpsEquipmentSonService.getClientList(projectId); return gpsEquipmentSonService.getClientList(projectId);
} }
@Override
public void setData(String jsonData) {
// 发送给指定用户equipment.getUserId()
WebSocketMessageDto messageDto = new WebSocketMessageDto();
messageDto.setMessage(jsonData);
messageDto.setSessionKeys(Collections.singletonList(1897160897167638522L));
WebSocketUtils.publishMessage(messageDto);
// WebSocketUtils.publishAll(jsonData);
}
} }

View File

@ -123,6 +123,16 @@ public class MatMaterialReceive extends BaseEntity {
*/ */
private String licenseCountFileId; private String licenseCountFileId;
/**
* 附件地址
*/
private String attachmentUrl;
/**
* 附件名称
*/
private String attachmentName;
/** /**
* 设备材料入库/移交 * 设备材料入库/移交
*/ */

View File

@ -94,6 +94,16 @@ public class MatMaterialReceiveCreateReq implements Serializable {
*/ */
private String licenseCountFileId; private String licenseCountFileId;
private String attachmentId;
/**
* 附件地址
*/
private String attachmentUrl;
/**
* 附件名称
*/
private String attachmentName;
/** /**
* 设备材料入库/移交 * 设备材料入库/移交
*/ */

View File

@ -87,6 +87,10 @@ public class MatMaterialReceiveUpdateReq implements Serializable {
*/ */
private String licenseCountFileId; private String licenseCountFileId;
/**
* 附件id
*/
private String attachmentId;
/** /**
* 设备材料入库/移交 * 设备材料入库/移交
*/ */

View File

@ -134,6 +134,15 @@ public class MatMaterialReceiveVo implements Serializable {
*/ */
private List<SysOssVo> licenseCountFile; private List<SysOssVo> licenseCountFile;
/**
* 附件地址
*/
private String attachmentUrl;
/**
* 附件名称
*/
private String attachmentName;
/** /**
* 设备材料入库/移交 * 设备材料入库/移交
*/ */

View File

@ -241,7 +241,8 @@ public class MatMaterialReceiveServiceImpl extends ServiceImpl<MatMaterialReceiv
req.getLicenseCountFileId(), req.getLicenseCountFileId(),
req.getReportCountFileId(), req.getReportCountFileId(),
req.getTechDocCountFileId(), req.getTechDocCountFileId(),
req.getCertCountFileId()); req.getCertCountFileId(),
req.getAttachmentId());
boolean save = this.save(materialReceive); boolean save = this.save(materialReceive);
if (!save) { if (!save) {
throw new ServiceException("物料接收单新增失败", HttpStatus.ERROR); throw new ServiceException("物料接收单新增失败", HttpStatus.ERROR);
@ -305,7 +306,8 @@ public class MatMaterialReceiveServiceImpl extends ServiceImpl<MatMaterialReceiv
req.getLicenseCountFileId(), req.getLicenseCountFileId(),
req.getReportCountFileId(), req.getReportCountFileId(),
req.getTechDocCountFileId(), req.getTechDocCountFileId(),
req.getCertCountFileId()); req.getCertCountFileId(),
req.getAttachmentId());
boolean update = this.updateById(materialReceive); boolean update = this.updateById(materialReceive);
if (!update) { if (!update) {
throw new ServiceException("物料接收单修改失败", HttpStatus.ERROR); throw new ServiceException("物料接收单修改失败", HttpStatus.ERROR);
@ -482,9 +484,10 @@ public class MatMaterialReceiveServiceImpl extends ServiceImpl<MatMaterialReceiv
* @param reportCountFileId 报表文件id * @param reportCountFileId 报表文件id
* @param techDocCountFileId 技术文档文件id * @param techDocCountFileId 技术文档文件id
* @param certCountFileId 证书文件id * @param certCountFileId 证书文件id
* @param attachmentId
*/ */
private void getFileSize(MatMaterialReceive materialReceive, String licenseCountFileId, private void getFileSize(MatMaterialReceive materialReceive, String licenseCountFileId,
String reportCountFileId, String techDocCountFileId, String certCountFileId) { String reportCountFileId, String techDocCountFileId, String certCountFileId, String attachmentId) {
if (StringUtils.isNotBlank(licenseCountFileId)) { if (StringUtils.isNotBlank(licenseCountFileId)) {
int size = Arrays.stream(licenseCountFileId.split(",")).map(Long::parseLong).toList().size(); int size = Arrays.stream(licenseCountFileId.split(",")).map(Long::parseLong).toList().size();
materialReceive.setLicenseCount(size); materialReceive.setLicenseCount(size);
@ -501,6 +504,11 @@ public class MatMaterialReceiveServiceImpl extends ServiceImpl<MatMaterialReceiv
int size = Arrays.stream(certCountFileId.split(",")).map(Long::parseLong).toList().size(); int size = Arrays.stream(certCountFileId.split(",")).map(Long::parseLong).toList().size();
materialReceive.setCertCount(size); materialReceive.setCertCount(size);
} }
if (StringUtils.isNotBlank(attachmentId)) {
SysOssVo ossVo = ossService.getById(Long.valueOf(attachmentId));
materialReceive.setAttachmentUrl(ossVo.getUrl());
materialReceive.setAttachmentName(ossVo.getOriginalName());
}
} }
/** /**

View File

@ -42,6 +42,14 @@ public class BusBLimitListVersions extends BaseEntity {
*/ */
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* excel文件 * excel文件
*/ */

View File

@ -44,6 +44,14 @@ public class BusBLimitListVersionsBo extends BaseEntity {
@NotBlank(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class }) @NotBlank(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class })
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* excel文件 * excel文件
*/ */

View File

@ -52,6 +52,14 @@ public class BusBLimitListVersionsVo implements Serializable {
@ExcelProperty(value = "版本号") @ExcelProperty(value = "版本号")
private String versions; private String versions;
/**
* 版本号名称
*/
private String versionsName;
/** /**
* excel文件 * excel文件
*/ */

View File

@ -51,6 +51,9 @@ public class FlowHisTaskVo implements Serializable {
*/ */
private Long definitionId; private Long definitionId;
private String projectName;
/** /**
* 流程定义名称 * 流程定义名称
*/ */

View File

@ -42,6 +42,8 @@ public class FlowInstanceVo {
*/ */
private Long definitionId; private Long definitionId;
private String projectName;
/** /**
* 流程定义名称 * 流程定义名称
*/ */

View File

@ -50,6 +50,9 @@ public class FlowTaskVo implements Serializable {
*/ */
private Long definitionId; private Long definitionId;
private String projectName;
/** /**
* 流程实例表id * 流程实例表id
*/ */

View File

@ -27,9 +27,11 @@
fd.version, fd.version,
fd.form_custom, fd.form_custom,
fd.form_path, fd.form_path,
fd.category fd.category,
bp.project_name
from flow_instance fi from flow_instance fi
left join flow_definition fd on fi.definition_id = fd.id left join flow_definition fd on fi.definition_id = fd.id
left join bus_project bp on bp.id = SUBSTRING_INDEX(fd.flow_code, '_', 1)
${ew.getCustomSqlSegment} ${ew.getCustomSqlSegment}
</select> </select>

View File

@ -64,11 +64,13 @@
COALESCE(t.form_path, d.form_path) as form_path, COALESCE(t.form_path, d.form_path) as form_path,
d.version, d.version,
uu.processed_by, uu.processed_by,
uu.type uu.type,
bp.project_name
from flow_task t from flow_task t
left join flow_user uu on uu.associated = t.id left join flow_user uu on uu.associated = t.id
left join flow_definition d on t.definition_id = d.id left join flow_definition d on t.definition_id = d.id
left join flow_instance i on t.instance_id = i.id left join flow_instance i on t.instance_id = i.id
LEFT JOIN bus_project bp ON bp.id = SUBSTRING_INDEX( d.flow_code, '_', 1 )
where t.node_type = 1 where t.node_type = 1
and t.del_flag = '0' and t.del_flag = '0'
and uu.del_flag = '0' and uu.del_flag = '0'
@ -180,10 +182,12 @@
c.flow_name, c.flow_name,
c.flow_code, c.flow_code,
c.category, c.category,
c.version c.version,
bp.project_name
from flow_his_task a from flow_his_task a
left join flow_instance b on a.instance_id = b.id left join flow_instance b on a.instance_id = b.id
left join flow_definition c on a.definition_id = c.id left join flow_definition c on a.definition_id = c.id
LEFT JOIN bus_project bp ON bp.id = SUBSTRING_INDEX( c.flow_code, '_', 1 )
where a.del_flag ='0' where a.del_flag ='0'
and b.del_flag = '0' and b.del_flag = '0'
and c.del_flag = '0' and c.del_flag = '0'
@ -214,11 +218,13 @@
d.flow_name, d.flow_name,
d.flow_code, d.flow_code,
d.category, d.category,
d.version d.version,
bp.project_name
from flow_user a from flow_user a
left join flow_his_task b on a.associated = b.task_id left join flow_his_task b on a.associated = b.task_id
left join flow_instance c on b.instance_id = c.id left join flow_instance c on b.instance_id = c.id
left join flow_definition d on c.definition_id=d.id left join flow_definition d on c.definition_id=d.id
LEFT JOIN bus_project bp ON bp.id = SUBSTRING_INDEX( d.flow_code, '_', 1 )
where a.type = '4' where a.type = '4'
and a.del_flag = '0' and a.del_flag = '0'
and b.del_flag = '0' and b.del_flag = '0'