1. 工单相关

This commit is contained in:
zhaowenyuan 2024-07-01 10:30:12 +08:00
parent 1a844ffa44
commit 6d58e43fa6
31 changed files with 1074 additions and 273 deletions

View File

@ -15,11 +15,12 @@
</dependency>
<dependency>
<groupId>com.chushang</groupId>
<artifactId>chushang-common-excel</artifactId>
<artifactId>chushang-common-office</artifactId>
</dependency>
<dependency>
<groupId>com.chushang</groupId>
<artifactId>oss-feign</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -36,6 +36,10 @@ public class InspectionConfigVO implements Serializable {
* 模板路径
*/
private String templateUrl;
/**
* 对应的工单id
*/
private Long wrkId;
/**
* 详细信息
*/

View File

@ -22,13 +22,11 @@ public class WrkImgVO implements Serializable {
/**
* 主键
*/
@TableId(value = "img_id", type = IdType.ASSIGN_ID)
private Long imgId;
/**
* 工单id
*/
@TableField(value = "wrk_id")
private Long wrkId;
/**
@ -40,18 +38,15 @@ public class WrkImgVO implements Serializable {
/**
* 真实请求路径
*/
@TableField(value = "real_path")
private String realPath;
/**
* 文件fid
*/
@TableField(value = "fid")
private String fid;
/**
* 文件大小
*/
@TableField(value = "`size`")
private Long size;
}

View File

@ -6,6 +6,7 @@ import com.chushang.common.core.context.SecurityContextHolder;
import com.chushang.common.core.util.SpringUtils;
import com.chushang.common.core.web.AjaxResult;
import com.chushang.common.core.web.Result;
import com.chushang.inspection.utils.PoolUtils;
import com.chushang.security.utils.SecurityUtils;
import com.chushang.task.entity.TaskInfo;
import com.chushang.task.entity.dto.UpdateTaskDTO;
@ -36,6 +37,7 @@ import java.util.Objects;
public class InspectionConsumerService implements RocketMQListener<TaskInfo> {
@Resource
RemoteTaskService remoteTaskService;
/**
* 执行 下发的 后台任务
*/
@ -44,67 +46,72 @@ public class InspectionConsumerService implements RocketMQListener<TaskInfo> {
remoteTaskService.updateTask(message.getTaskId(), UpdateTaskDTO.builder()
.taskStatus(TaskStatusEnum.EXECUTING)
.build(), SecurityConstants.INNER);
// 通过 反射 去执行具体方法
String className = message.getClassName();
String methodName = message.getMethodName();
String params = message.getParams();
Integer taskType = message.getTaskType();
SecurityContextHolder.setDeptId(message.getDeptId());
UpdateTaskDTO updateTask = new UpdateTaskDTO();
try {
// 包名+类名
Class classzz = Class.forName(className);
// 获取构造器对象
// 利用spring 获取对象
Object o = SpringUtils.getBean(classzz);
// 传递需要执行的方法
Method method = classzz.getMethod(methodName, String.class);
// 调用的方法有多个参数 Method method = classzz.getMethod("class1method",long.class,String.class,String.class);
// 如果调用的方法有参数 invoke(o,param1,param2,param3,...)
updateTask.setLastRunTime(LocalDateTime.now());
Object invoke = method.invoke(o, params);
if (invoke instanceof AjaxResult result){
Integer code = (Integer) result.get(AjaxResult.DATA_TAG);
if (result.isSuccess() && 200 == code){
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_SUCCESS);
String data = (String)result.get(AjaxResult.DATA_TAG);
String msg = (String) result.get(AjaxResult.MSG_TAG);
updateTask.setLastRunResult(msg);
if (Objects.equals(taskType, TaskTypeEnum.DOWN.getCode())){
updateTask.setRemark(data);
// 通过线程池 进行调用
PoolUtils.SENTINEL.getInstance().execute(()->{
// 通过 反射 去执行具体方法
String className = message.getClassName();
String methodName = message.getMethodName();
String params = message.getParams();
Integer taskType = message.getTaskType();
SecurityContextHolder.setDeptId(message.getDeptId());
UpdateTaskDTO updateTask = new UpdateTaskDTO();
try {
// 包名+类名
Class classzz = Class.forName(className);
// 获取构造器对象
// 利用spring 获取对象
Object o = SpringUtils.getBean(classzz);
// 传递需要执行的方法
Method method = classzz.getMethod(methodName, String.class);
// 调用的方法有多个参数 Method method = classzz.getMethod("class1method",long.class,String.class,String.class);
// 如果调用的方法有参数 invoke(o,param1,param2,param3,...)
updateTask.setLastRunTime(LocalDateTime.now());
Object invoke = method.invoke(o, params);
if (invoke instanceof AjaxResult result){
Integer code = (Integer) result.get(AjaxResult.DATA_TAG);
if (result.isSuccess() && 200 == code){
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_SUCCESS);
String data = (String)result.get(AjaxResult.DATA_TAG);
String msg = (String) result.get(AjaxResult.MSG_TAG);
updateTask.setLastRunResult(msg);
if (Objects.equals(taskType, TaskTypeEnum.DOWN.getCode())){
updateTask.setRemark(data);
}
}else {
String errMsg = (String)result.get(AjaxResult.MSG_TAG);
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_FAIL);
updateTask.setLastRunResult(errMsg);
}
}else {
String errMsg = (String)result.get(AjaxResult.MSG_TAG);
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_FAIL);
updateTask.setLastRunResult(errMsg);
}
}else if (invoke instanceof Result<?> result){
if (result.isSuccess() && result.getCode() == 200){
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_SUCCESS);
String data = (String)result.getData();
String msg = result.getMsg();
updateTask.setLastRunResult(msg);
if (Objects.equals(taskType, TaskTypeEnum.DOWN.getCode())){
updateTask.setRemark(data);
else if (invoke instanceof Result<?> result){
if (result.isSuccess() && result.getCode() == 200){
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_SUCCESS);
String data = (String)result.getData();
String msg = result.getMsg();
updateTask.setLastRunResult(msg);
if (Objects.equals(taskType, TaskTypeEnum.DOWN.getCode())){
updateTask.setRemark(data);
}
}else {
String errMsg = result.getMsg();
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_FAIL);
updateTask.setLastRunResult(errMsg);
}
}else {
String errMsg = result.getMsg();
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_FAIL);
updateTask.setLastRunResult(errMsg);
}
}
}
catch (Exception e){
log.error("执行失败", e);
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_FAIL);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(e).append("\n");
for (StackTraceElement s : e.getStackTrace()) {
stringBuilder.append(s.toString()).append("\n");
catch (Exception e)
{
log.error("执行失败", e);
updateTask.setTaskStatus(TaskStatusEnum.EXECUTE_FAIL);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(e).append("\n");
for (StackTraceElement s : e.getStackTrace()) {
stringBuilder.append(s.toString()).append("\n");
}
updateTask.setLastRunResult(stringBuilder.toString());
}
updateTask.setLastRunResult(stringBuilder.toString());
}
// 执行完毕后 更新 任务状态
remoteTaskService.updateTask(message.getTaskId(), updateTask, SecurityConstants.INNER);
// 执行完毕后 更新 任务状态
remoteTaskService.updateTask(message.getTaskId(), updateTask, SecurityConstants.INNER);
});
}
}

View File

@ -0,0 +1,31 @@
package com.chushang.inspection.ins;
import com.chushang.inspection.work.vo.InspectionConfigVO;
import com.chushang.inspection.work.vo.WrkInfoDetailsVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* 生成 word, 需要 先试下默认的
* @auther: zhao
* @date: 2024/6/29 14:44
*/
@Slf4j
@Service
public class DefaultGeneratedIns implements GeneratedIns{
@Override
public void generated(Map<Long, WrkInfoDetailsVO> wrkMaps, InspectionConfigVO insConfig, String basePath) {
}
/**
* 用于 注册
*/
@Override
public String register() {
return "default";
}
}

View File

@ -0,0 +1,151 @@
package com.chushang.inspection.ins;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.chushang.common.core.constant.SecurityConstants;
import com.chushang.common.core.web.Result;
import com.chushang.inspection.project.vo.DetailsVO;
import com.chushang.inspection.work.vo.*;
import com.chushang.oss.feign.RemoteOssService;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.data.UrlPictureRenderData;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @auther: zhao
* @date: 2024/6/29 11:43
*/
@Slf4j
@Service
public abstract class DefaultGeneratedInspection implements GeneratedInspection {
@Resource
RemoteOssService remoteOssService;
@Override
public abstract List<CompletableFuture<Void>> generated(Map<Long, WrkInfoDetailsVO> info, InspectionConfigVO inspection, String path, Executor executor);
@Override
public void compileWord(String fileName, String templatePath, Map<String, Object> data) {
XWPFTemplate template = null;
try (InputStream stream = ResourceUtil.getStream("template" + File.separator + templatePath)) {
template = XWPFTemplate.compile(stream);
template.render(data);
FileUtil.touch(fileName);
template.writeToFile(fileName);
} catch (Exception e) {
log.error("【{}】模版替换失败", fileName, e);
} finally {
IoUtil.close(template);
}
}
@Override
public <T extends GeneratedInspection> Map<String, Object> InspectionToMap(WrkInfoDetailsVO inspection, Integer width, Integer height, int... imgTypes) {
Map<String, Object> map = BeanUtil.beanToMap(inspection, Maps.newHashMap(),
true, v -> "images".equals(v) ? null : v);
WrkInfoVO wrkInfo = inspection.getWrkInfo();
List<WrkImgVO> images = inspection.getInfoImg();
map.put("disposeTime", LocalDateTimeUtil.format(wrkInfo.getDisposeTime(), DatePattern.CHINESE_DATE_PATTERN));
map.put("createTime", LocalDateTimeUtil.format(wrkInfo.getDisposeTime(), DatePattern.CHINESE_DATE_PATTERN));
if (ArrayUtil.isEmpty(imgTypes) || CollUtil.isEmpty(images)) {
return map;
}
getImage(images, map, width, height, null, imgTypes);
return map;
}
@Override
public <T extends GeneratedInspection> void getImage(List<WrkImgVO> images, Map<String, Object> data, Integer width, Integer height, int[] exclude, int... imgTypes) {
if (CollUtil.isEmpty(images)) {
return;
}
Map<Integer, WrkImgVO> imgMap = images.stream().filter(img -> exclude == null || !ArrayUtil.contains(exclude, img.getImgType()))
.collect(Collectors.toMap(WrkImgVO::getImgType, v -> v, (v1, v2) -> v1));
if (CollUtil.isEmpty(imgMap)) {
return;
}
if (ArrayUtil.isNotEmpty(imgTypes)) {
for (int imgType : imgTypes) {
if (!imgMap.containsKey(imgType) || imgType == -1) {
continue;
}
// 此处需要直接通过minio 获取?
WrkImgVO img = imgMap.get(imgType);
data.put("img" + imgType, getFile(width, height, img));
}
} else {
AtomicInteger i = new AtomicInteger(1);
imgMap.forEach((imgType, img) -> {
if (imgType != -1) {
data.put("img" + imgType, getFile(width, height, img));
i.getAndIncrement();
}
});
}
}
@Override
public String getFormat(String template, ConfigDataVO details, int i, boolean isRemark) {
Object[] arr = new Object[i];
String value = details.getConfigValue() == null ? StrUtil.EMPTY : details.getConfigValue();
if (value.contains(StrUtil.COMMA)) {
List<String> list = StrUtil.split(value, StrUtil.COMMA);
for (int j = 0; j < i; j++) {
if (list.contains(Convert.toStr(j + 1))) {
arr[j] = "";
} else {
arr[j] = "";
}
}
} else {
for (int j = 0; j < i; j++) {
if (Convert.toStr(j + 1).equals(value)) {
arr[j] = "";
} else {
arr[j] = "";
}
}
}
if (isRemark) {
arr[i - 1] = StrUtil.isBlank(details.getRemark()) ? StrUtil.EMPTY : details.getRemark();
}
return StrUtil.format(template, arr);
}
/**
* 获取图片
*/
private PictureRenderData getFile(Integer width, Integer height, WrkImgVO img) {
Result<byte[]> result = remoteOssService.getFile(img.getFid(), SecurityConstants.INNER);
if (result.isSuccess() && result.getData() != null) {
byte[] bytes = result.getData();
return Pictures.ofBytes(bytes).size(width, height).create();
}
return new UrlPictureRenderData(img.getRealPath());
}
}

View File

@ -0,0 +1,40 @@
package com.chushang.inspection.ins;
import cn.hutool.core.util.StrUtil;
import com.chushang.inspection.work.vo.InspectionConfigVO;
import com.chushang.inspection.work.vo.WrkInfoDetailsVO;
import java.io.File;
import java.util.Map;
/**
* 生成 模板
* @auther: zhao
* @date: 2024/6/29 14:37
*/
public interface GeneratedIns {
/**
* 生成 word 文档所需
*/
String SUFFIX_NAME = ".docx";
/**
* 应当为 Map<Long, WrkInfoDetailsVO> map 结构
*/
void generated(Map<Long, WrkInfoDetailsVO> wrkMaps, InspectionConfigVO insConfig, String basePath);
default String generateAFileName(String path, String... value) {
StringBuilder fileName = new StringBuilder(path);
fileName.append(File.separator);
for (String v : value) {
if (StrUtil.isNotEmpty(v) && v.equals(value[0])) {
fileName.append(v);
} else if (StrUtil.isNotEmpty(v)) {
fileName.append("-").append(v);
}
}
return fileName.append(SUFFIX_NAME).toString();
}
String register();
}

View File

@ -0,0 +1,64 @@
//package com.chushang.inspection.ins;
//
//import cn.hutool.core.collection.CollectionUtil;
//import com.chushang.inspection.work.vo.InspectionConfigVO;
//import com.chushang.inspection.work.vo.WrkInfoDetailsVO;
//import com.chushang.oss.config.UploadConfig;
//import com.google.common.collect.Lists;
//import io.minio.MinioProperties;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.io.File;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.CompletableFuture;
//import java.util.concurrent.CyclicBarrier;
//
///**
// * 模板生成工厂
// * @auther: zhao
// * @date: 2024/7/1 9:33
// */
//@Slf4j
//@Service
//public class GeneratedInsFactory {
//
// private final DefaultGeneratedIns defaultGeneratedIns;
//
// public String getPath() {
// return UploadConfig.getTmpPath() + File.separator + "download" + File.separator + "word" + File.separator;
// }
//
// private final Map<String, GeneratedIns> generatedInsMap;
//
// GeneratedInsFactory(List<GeneratedIns> insList, DefaultGeneratedIns defaultGeneratedIns){
// generatedInsMap = new HashMap<>();
// insList.forEach(ins-> generatedInsMap.put(ins.register(), ins));
// this.defaultGeneratedIns = defaultGeneratedIns;
// }
//
// public void generated(Map<Long, WrkInfoDetailsVO> wrkMaps){
// // 生成文件名
// List<CompletableFuture<Void>> supplyAsync = Lists.newCopyOnWriteArrayList();
// CyclicBarrier cyclicBarrier = new CyclicBarrier(wrkMaps.keySet().size());
// // 此处应当指定 需要生成的 路径
// wrkMaps.forEach((wrkId, wrk)->{
// // 生成普通巡检单
// GeneratedIns defaultGeneratedIns = generatedInsMap.get("default");
// supplyAsync.addAll(defaultGeneratedIns.generated(wrkMaps, null, getPath(), EXECUTOR));
//
// List<InspectionConfigVO> inspections = wrk.getInspections();
// inspections.forEach(ins->{
// // 别名
// String alias = ins.getAlias();
// // 模板
// String templateUrl = ins.getTemplateUrl();
//
// });
// });
// }
//
//}

View File

@ -0,0 +1,61 @@
package com.chushang.inspection.ins;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.chushang.inspection.project.vo.DetailsVO;
import com.chushang.inspection.work.vo.*;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.Pictures;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* 生成巡检单信息
*/
public interface GeneratedInspection {
String SUFFIX_NAME = ".docx";
List<CompletableFuture<Void>> generated(Map<Long, WrkInfoDetailsVO> info, InspectionConfigVO inspection, String path, Executor executor);
default String generateAFileName(String path, String... value) {
StringBuilder fileName = new StringBuilder(path);
fileName.append(File.separator);
for (String v : value) {
if (StrUtil.isNotEmpty(v) && v.equals(value[0])) {
fileName.append(v);
} else if (StrUtil.isNotEmpty(v)) {
fileName.append("-").append(v);
}
}
return fileName.append(SUFFIX_NAME).toString();
}
void compileWord(String fileName, String templatePath, Map<String, Object> data);
<T extends GeneratedInspection> Map<String, Object> InspectionToMap(WrkInfoDetailsVO inspection, Integer width, Integer height, int... imgTypes);
<T extends GeneratedInspection> void getImage(List<WrkImgVO> images, Map<String, Object> data,Integer width, Integer height, int[] exclude, int... imgTypes);
String getFormat(String template, ConfigDataVO insList, int i, boolean isRemark);
}

View File

@ -15,6 +15,7 @@ import com.chushang.security.annotation.RequiresPermissions;
import com.chushang.security.utils.SecurityUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@ -102,6 +103,16 @@ public class InsConfigController {
configService.updateByEntityId(config);
return AjaxResult.success(config.getConfigId());
}
/**
* 巡检单上传
*/
@SysLog(value = "巡检单", businessType = BusinessType.UPLOAD)
@PostMapping(value = "/upload")
@RequiresPermissions("wrk:config:upload")
public AjaxResult templateUpload(@RequestParam("file") MultipartFile file)
{
return AjaxResult.success(configService.uploadTemplate(file));
}
}

View File

@ -66,6 +66,7 @@ public class InsDetailController {
detail.setDetailId(null);
Long configId = detail.getConfigId();
AssertUtil.invalidate(null == configId, "巡检单配置id 不能为空");
String configKey = detail.getConfigKey();
AssertUtil.invalidate(null == configKey, "巡检单配置key 不能为空");

View File

@ -28,7 +28,7 @@ import java.util.List;
*/
@Slf4j
@RestController
@RequestMapping(value = "/inspection/task")
@RequestMapping(value = "/task")
public class PollTaskController {
@Resource

View File

@ -8,6 +8,7 @@ import com.chushang.inspection.work.vo.InspectionConfigVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Set;
/**
* @auther: zhao
@ -15,5 +16,7 @@ import java.util.List;
*/
public interface InspectionDataMapper extends BaseMapper<InspectionData> {
@DataScope(deptAlias = "ic")
List<InspectionConfigVO> listInspections(@Param("wrkId") Long wrkId, @Param("query") CommonParam query);
List<InspectionConfigVO> listInspectionsByWrkId(@Param("wrkId") Long wrkId, @Param("query") CommonParam query);
@DataScope(deptAlias = "ic")
List<InspectionConfigVO> listInspectionsByWrkIds(@Param("wrkIds") Set<Long> wrkIds, @Param("query") CommonParam query);
}

View File

@ -9,6 +9,7 @@ import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.inspection.project.po.InspectionConfig;
import com.chushang.inspection.project.query.InsConfigQuery;
import com.chushang.inspection.project.vo.InsConfigVO;
import org.springframework.web.multipart.MultipartFile;
/**
* @auther: zhao
@ -33,4 +34,6 @@ public interface InspectionConfigService extends IService<InspectionConfig>{
void updateByEntityId(InspectionConfig config);
void saveEntity(InspectionConfig config);
String uploadTemplate(MultipartFile file);
}

View File

@ -5,6 +5,7 @@ import com.chushang.inspection.project.po.InspectionData;
import com.chushang.inspection.work.vo.InspectionConfigVO;
import java.util.List;
import java.util.Set;
/**
* @auther: zhao
@ -14,4 +15,6 @@ public interface InspectionDataService extends IService<InspectionData>{
List<InspectionConfigVO> listInspections(Long wrkId);
List<InspectionConfigVO> listInspections(Set<Long> wrkIds);
}

View File

@ -4,6 +4,9 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chushang.common.core.constant.SecurityConstants;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.web.Result;
import com.chushang.common.mybatis.enums.Operator;
import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.inspection.project.po.InspectionDetail;
@ -11,6 +14,10 @@ import com.chushang.inspection.project.vo.DetailsVO;
import com.chushang.inspection.project.vo.InsConfigVO;
import com.chushang.inspection.project.service.InspectionConfigService;
import com.chushang.inspection.project.service.InspectionDetailService;
import com.chushang.oss.entity.dto.UploadBytesDTO;
import com.chushang.oss.entity.dto.UploadFileDTO;
import com.chushang.oss.entity.vo.FileSourceVo;
import com.chushang.oss.feign.RemoteOssService;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
@ -19,6 +26,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chushang.inspection.project.po.InspectionConfig;
import com.chushang.inspection.project.mapper.InspectionConfigMapper;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.List;
@ -33,6 +41,8 @@ public class InspectionConfigServiceImpl extends ServiceImpl<InspectionConfigMap
@Resource
InspectionDetailService detailService;
@Resource
RemoteOssService remoteOssService;
@Override
@CachePut(key = "#alias")
@ -72,4 +82,20 @@ public class InspectionConfigServiceImpl extends ServiceImpl<InspectionConfigMap
public void saveEntity(InspectionConfig config) {
save(config);
}
/**
* 上传巡检单 信息
*/
@Override
public String uploadTemplate(MultipartFile file) {
// 上传模板信息
Result<List<FileSourceVo>> listResult =
remoteOssService.uploadFile(UploadFileDTO.builder()
.files(new MultipartFile[]{file})
.build(), null, null, null, "template", SecurityConstants.INNER);
if (listResult.isSuccess() && CollectionUtil.isNotEmpty(listResult.getData())){
return listResult.getData().get(0).getFilePath();
}
throw new ResultException("上传失败");
}
}

View File

@ -9,6 +9,7 @@ import com.chushang.inspection.project.po.InspectionData;
import com.chushang.inspection.project.mapper.InspectionDataMapper;
import java.util.List;
import java.util.Set;
/**
* @auther: zhao
@ -18,12 +19,19 @@ import java.util.List;
public class InspectionDataServiceImpl extends ServiceImpl<InspectionDataMapper, InspectionData> implements InspectionDataService {
/**
* 根据工单id 查询对应的 巡检单信息
* @param wrkId
* @return
* @param wrkId 工单id
*/
@Override
public List<InspectionConfigVO> listInspections(Long wrkId) {
CommonParam commonParam = CommonParam.buildPageRequest();
return baseMapper.listInspections(wrkId, commonParam);
return baseMapper.listInspectionsByWrkId(wrkId, commonParam);
}
/**
* 根据工单id, 获取对应 巡检单信息
*/
public List<InspectionConfigVO> listInspections(Set<Long> wrkIds) {
CommonParam commonParam = CommonParam.buildPageRequest();
return baseMapper.listInspectionsByWrkIds(wrkIds, commonParam);
}
}

View File

@ -24,7 +24,7 @@ import javax.validation.constraints.NotNull;
* @author xxxxx
*/
@RestController
@RequestMapping("/consumables_total")
@RequestMapping("/consumables/total")
public class ConsumablesTotalController {
/**
* 服务对象
@ -32,17 +32,6 @@ public class ConsumablesTotalController {
@Resource
ConsumablesTotalService consumablesTotalService;
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("selectOne")
public ConsumablesTotal selectOne(Integer id) {
return consumablesTotalService.getById(id);
}
/**
* 查询耗材总数
*

View File

@ -16,6 +16,7 @@ import com.chushang.inspection.terminal.query.FiveUnifiedStoreDetailsQuery;
import com.chushang.inspection.terminal.service.FiveStoreService;
import com.chushang.inspection.terminal.service.StoreService;
import com.chushang.inspection.terminal.vo.FiveStoreVO;
import com.chushang.oss.entity.dto.UploadBytesDTO;
import com.chushang.oss.entity.vo.FileSourceVo;
import com.chushang.oss.feign.RemoteOssService;
import com.chushang.security.utils.SecurityUtils;
@ -97,7 +98,8 @@ public class FiveStoreServiceImpl extends ServiceImpl<FiveStoreMapper, FiveStore
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){
ExcelUtils.exportList(outputStream, FiveStoreVO.class, listFiveStores, "五统一商户明细");
// 上传到oss fileStore 是五统一的商户文件
Result<List<FileSourceVo>> listResult = ossService.uploadFile(outputStream.toByteArray(), "五统一商户明细导出.xlsx", false, "", "fileStore", SecurityConstants.INNER);
Result<List<FileSourceVo>> listResult = ossService.uploadFile(UploadBytesDTO.builder()
.bytes(outputStream.toByteArray()).build(), "五统一商户明细导出.xlsx", false, "", "fileStore", SecurityConstants.INNER);
if (listResult.isSuccess() && CollectionUtil.isNotEmpty(listResult.getData())){
List<FileSourceVo> data = listResult.getData();

View File

@ -0,0 +1,67 @@
package com.chushang.inspection.utils;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author by zhaowenyuan create 2022/7/26 09:28
* 线程池
*/
public enum PoolUtils {
/**
* 线程池
*/
SENTINEL("WRK-INSPECTION-POOL-SERVICE"),
;
private final ThreadPoolExecutor instance;
PoolUtils(String threadName){
this.instance = new ThreadPoolExecutor(
5,
10,
300L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3000),
new NameThreadFactory(threadName));
}
public ThreadPoolExecutor getInstance(){
return instance;
}
public void destroy(){
this.instance.shutdown();
}
static class NameThreadFactory implements ThreadFactory{
private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
NameThreadFactory(String name){
SecurityManager securityManager = System.getSecurityManager();
group = (securityManager != null) ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup();
if (null == name || name.isEmpty()){
name = "pool";
}
namePrefix = name + "-" + POOL_NUMBER.getAndIncrement() + "-thread-";
}
@Override
public Thread newThread(Runnable runnable) {
Thread t = new Thread(group, runnable, namePrefix + threadNumber.getAndIncrement(), 0);
if (t.isDaemon()){
t.setDaemon(false);
}
if (t.getPriority() != Thread.NORM_PRIORITY){
t.setPriority(Thread.NORM_PRIORITY);
}
return t;
}
}
}

View File

@ -78,7 +78,7 @@ public class WrkInfoController {
@SysLog(value = "app", businessType = BusinessType.QUERY)
@GetMapping("/app/page")
@RequiresPermissions("wrk:app:page")
public AjaxResult queryAppPage(@RequestBody @Validated WrkAppQuery query) {
public AjaxResult queryAppPage(@Validated WrkAppQuery query) {
boolean isRecheck = TaskConfigUtils.reviewMethod(query.getTaskId()) == 3;
Integer wrkStatus = query.getWrkStatus();
List<Integer> wrkStatusList = new ArrayList<>();
@ -100,7 +100,7 @@ public class WrkInfoController {
@SysLog(value = "工单归档信息", businessType = BusinessType.QUERY)
@GetMapping("/archive/page")
@RequiresPermissions("wrk:archive:page")
public AjaxResult queryArchivePage(@RequestBody @Validated ReviewedQuery query) {
public AjaxResult queryArchivePage(@Validated ReviewedQuery query) {
Integer reviewMethod = TaskConfigUtils.reviewMethod(query.getTaskId());
query.setStates(reviewMethod == 3 ? Lists.newArrayList(4) : Lists.newArrayList(3));
return AjaxResult.success(wrkInfoService.queryArchivePage(query));
@ -112,7 +112,8 @@ public class WrkInfoController {
@SysLog("工单详情")
@PostMapping("/info/{wrkId}")
@RequiresPermissions("wrk:info")
public AjaxResult info(@PathVariable Long wrkId) {
public AjaxResult info(@PathVariable Long wrkId)
{
return AjaxResult.success(wrkInfoService.queryWorkOrderDetails(wrkId));
}
@ -193,4 +194,5 @@ public class WrkInfoController {
wrkInfoService.dispatch(query, 0);
return AjaxResult.success();
}
}

View File

@ -8,6 +8,7 @@ import com.chushang.inspection.work.query.WrkAppQuery;
import com.chushang.inspection.work.query.WrkInfoQuery;
import com.chushang.inspection.work.vo.WrkAuditVO;
import com.chushang.inspection.work.vo.WrkDispatchVO;
import com.chushang.inspection.work.vo.WrkInfoDetailsVO;
import com.chushang.inspection.work.vo.WrkListAppVO;
import org.apache.ibatis.annotations.Param;
@ -25,4 +26,8 @@ public interface WrkInfoMapper extends BaseMapper<WrkInfo> {
List<WrkAuditVO> queryArchivePage(@Param("query") ReviewedQuery query, Page<WrkAuditVO> page);
List<WrkListAppVO> queryAppPage(@Param("query") WrkAppQuery query, Page<WrkListAppVO> page);
List<WrkInfoDetailsVO> listInsTemplate(@Param("query") ReviewedQuery query);
WrkInfoDetailsVO getWrkInfoDetails(@Param("wrkId") Long wrkId);
}

View File

@ -3,8 +3,12 @@ package com.chushang.inspection.work.service;
import com.chushang.inspection.work.dto.ImageDTO;
import com.chushang.inspection.work.po.WrkImg;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chushang.inspection.work.vo.WrkImgVO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Set;
/**
* @auther: zhao
* @date: 2024/6/28 11:25
@ -15,4 +19,6 @@ public interface WrkImgService extends IService<WrkImg> {
String uploadPicture(MultipartFile file, Integer imgType, Long wrkId, String locationAddress);
void removeImg(ImageDTO image);
List<WrkImgVO> listImgByWrkIds(Set<Long> wrkIds);
}

View File

@ -27,4 +27,6 @@ public interface WrkInfoService extends IService<WrkInfo> {
WrkInfoDetailsVO queryWorkOrderDetails(Long wrkId);
List<WrkInfo> dispatch(DispatchQuery query, int i);
Long downInspectionTemplate(ReviewedQuery query);
}

View File

@ -1,13 +1,39 @@
package com.chushang.inspection.work.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.chushang.common.core.constant.SecurityConstants;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.exception.utils.AssertUtil;
import com.chushang.common.core.util.StringUtils;
import com.chushang.common.core.web.Result;
import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.inspection.work.dto.ImageDTO;
import com.chushang.inspection.work.po.WrkInfo;
import com.chushang.inspection.work.po.WrkInfoStoreRecord;
import com.chushang.inspection.work.service.WrkImgService;
import com.chushang.inspection.work.service.WrkInfoService;
import com.chushang.inspection.work.service.WrkInfoStoreRecordService;
import com.chushang.inspection.work.vo.WrkImgVO;
import com.chushang.oss.entity.dto.UploadBytesDTO;
import com.chushang.oss.entity.vo.FileSourceVo;
import com.chushang.oss.feign.RemoteOssService;
import com.chushang.security.utils.SecurityUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chushang.inspection.work.mapper.WrkImgMapper;
import com.chushang.inspection.work.po.WrkImg;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @auther: zhao
* @date: 2024/6/28 11:25
@ -15,13 +41,62 @@ import org.springframework.web.multipart.MultipartFile;
@Service
public class WrkImgServiceImpl extends ServiceImpl<WrkImgMapper, WrkImg> implements WrkImgService {
@Resource
RemoteOssService remoteOssService;
@Override
public String uploadPicture(MultipartFile file, Integer imgType, Long wrkId, String locationAddress) {
return "";
@Transactional
public String uploadPicture(MultipartFile file, Integer imgType, Long wrkId, String locationAddress)
{
try {
// locationAddress 用于添加水印
Result<List<FileSourceVo>> listResult = remoteOssService.uploadFile(UploadBytesDTO.builder()
.bytes(file.getBytes()).build(),
file.getOriginalFilename(),
StringUtils.isNotEmpty(locationAddress),
locationAddress,
"wrkImg",
SecurityConstants.INNER);
if (listResult.isSuccess() && CollectionUtil.isNotEmpty(listResult.getData())) {
List<FileSourceVo> data = listResult.getData();
FileSourceVo fileSourceVo = data.get(0);
WrkImg wrkImg = new WrkImg();
wrkImg.setWrkId(wrkId);
wrkImg.setImgType(imgType);
wrkImg.setFid(fileSourceVo.getFid());
wrkImg.setSize(fileSourceVo.getSize());
wrkImg.setDeptId(SecurityUtils.getDeptId());
wrkImg.setRealPath(fileSourceVo.getFilePath());
save(wrkImg);
}
throw new ResultException("上传图片失败");
} catch (IOException e) {
log.error("{}", e);
}
return null;
}
@Override
public void removeImg(ImageDTO image) {
@Transactional
public void removeImg(ImageDTO image)
{
LambdaQueryWrapper<WrkImg> imgSql = WrapperUtils.builder();
imgSql.eq(WrkImg::getWrkId, image.getWrkId())
.eq(WrkImg::getImgType, image.getImgType());
List<WrkImg> imgList = list(imgSql);
if (CollectionUtil.isNotEmpty(imgList)){
Set<Long> imgIds = imgList.stream().map(WrkImg::getImgId).collect(Collectors.toSet());
removeByIds(imgIds);
Set<String> fids = imgList.stream().map(WrkImg::getFid).collect(Collectors.toSet());
Result<String> stringResult = remoteOssService.delFile(fids, SecurityConstants.INNER);
AssertUtil.invalidate(!stringResult.isSuccess(), stringResult.getMsg());
}
}
@Override
public List<WrkImgVO> listImgByWrkIds(Set<Long> wrkIds) {
List<WrkImg> imgList = list(new LambdaQueryWrapper<WrkImg>().in(WrkImg::getWrkId, wrkIds));
if (CollectionUtil.isNotEmpty(imgList))
return BeanUtil.copyToList(imgList, WrkImgVO.class);
return List.of();
}
}

View File

@ -29,6 +29,7 @@ import com.chushang.inspection.terminal.service.TerminalService;
import com.chushang.inspection.work.dto.WrkInfoPhoneImportDTO;
import com.chushang.inspection.work.query.WrkInfoQuery;
import com.chushang.inspection.work.service.WrkInfoPhoneService;
import com.chushang.oss.entity.dto.UploadBytesDTO;
import com.chushang.oss.entity.vo.FileSourceVo;
import com.chushang.oss.feign.RemoteOssService;
import com.chushang.security.utils.SecurityUtils;
@ -326,7 +327,9 @@ public class WrkInfoPhoneServiceImpl extends ServiceImpl<WrkInfoPhoneMapper, Wrk
if (CollectionUtil.isNotEmpty(errList)) {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){
ExcelUtils.exportList(outputStream, WrkInfoPhoneImportDTO.class, errList,"电话工单导入异常");
Result<List<FileSourceVo>> ossResult = remoteOssService.uploadFile(outputStream.toByteArray(), "", null, null, "", SecurityConstants.INNER);
Result<List<FileSourceVo>> ossResult = remoteOssService.uploadFile(
UploadBytesDTO.builder().bytes(outputStream.toByteArray()).build()
, "", null, null, "", SecurityConstants.INNER);
if (ossResult.isSuccess() && CollectionUtil.isNotEmpty(ossResult.getData())){
List<FileSourceVo> data = ossResult.getData();
FileSourceVo fileSourceVo = data.get(0);

View File

@ -5,10 +5,13 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chushang.common.core.constant.SecurityConstants;
import com.chushang.common.core.exception.ResultException;
import com.chushang.common.core.exception.utils.AssertUtil;
import com.chushang.common.core.util.DateUtils;
import com.chushang.common.core.util.IPUtils;
import com.chushang.common.core.web.Result;
import com.chushang.common.mybatis.enums.Operator;
@ -16,6 +19,7 @@ import com.chushang.common.mybatis.page.CommonParam;
import com.chushang.common.mybatis.utils.PageResult;
import com.chushang.common.mybatis.utils.WrapperUtils;
import com.chushang.datascope.annotation.DataScope;
import com.chushang.inspection.ins.GeneratedIns;
import com.chushang.inspection.project.service.InspectionDataService;
import com.chushang.inspection.terminal.po.FiveStore;
import com.chushang.inspection.terminal.po.Terminal;
@ -33,6 +37,11 @@ import com.chushang.inspection.work.query.WrkAppQuery;
import com.chushang.inspection.work.query.WrkInfoQuery;
import com.chushang.inspection.work.service.*;
import com.chushang.inspection.work.vo.*;
import com.chushang.security.utils.SecurityUtils;
import com.chushang.task.entity.dto.CreateTaskDTO;
import com.chushang.task.enums.ServiceEnum;
import com.chushang.task.enums.TaskTypeEnum;
import com.chushang.task.feign.RemoteTaskService;
import com.chushang.security.entity.po.SysUser;
import com.chushang.system.feign.RemoteUserService;
import lombok.RequiredArgsConstructor;
@ -43,11 +52,14 @@ import com.chushang.inspection.work.mapper.WrkInfoMapper;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @auther: zhao
@ -56,37 +68,26 @@ import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class WrkInfoServiceImpl extends ServiceImpl<WrkInfoMapper, WrkInfo> implements WrkInfoService {
@Resource
WrkInfoTerminalRecordService terminalRecordService;
@Resource
WrkInfoStoreRecordService storeRecordService;
@Resource
WrkInfoAuditService infoAuditService;
@Resource
InspectionDataService inspectionDataService;
@Resource
WrkImgService wrkImgService;
@Resource
WrkInfoService wrkInfoService;
@Resource
WrkInfoStoreRecordService wrkInfoStoreRecordService;
@Resource
WrkInfoTerminalRecordService wrkInfoTerminalRecordService;
@Resource
FiveStoreService fiveStoreService;
@Resource
TerminalService terminalService;
@Resource
StoreService service;
RemoteTaskService remoteTaskService;
@Resource
RemoteUserService userFeignService;
@Resource
GeneratedIns generatedIns;
@Value("${push.icbc-js.enable:false}")
private boolean enable;
@ -113,6 +114,9 @@ public class WrkInfoServiceImpl extends ServiceImpl<WrkInfoMapper, WrkInfo> impl
return new PageResult(records, page);
}
/**
* app查询
*/
@Override
@DataScope(deptAlias = "i")
public PageResult queryAppPage(WrkAppQuery query) {
@ -125,38 +129,38 @@ public class WrkInfoServiceImpl extends ServiceImpl<WrkInfoMapper, WrkInfo> impl
@Override
public WrkInfoDetailsVO queryWorkOrderDetails(Long wrkId) {
WrkInfoDetailsVO infoDetail = new WrkInfoDetailsVO();
// 终端信息
WrkInfoTerminalRecord terminalRecord = terminalRecordService.getById(wrkId);
// 商户信息
WrkInfoStoreRecord storeRecord = storeRecordService.getById(wrkId);
infoDetail.setInfoTerminal(BeanUtil.copyProperties(terminalRecord, WrkInfoTerminalVO.class));
infoDetail.setInfoStore(BeanUtil.copyProperties(storeRecord, WrkInfoStoreVO.class));
// 工单信息
WrkInfo wrkInfo = getById(wrkId);
infoDetail.setWrkInfo(BeanUtil.copyProperties(wrkInfo, WrkInfoVO.class));
// // 终端信息
// WrkInfoTerminalRecord terminalRecord = terminalRecordService.getById(wrkId);
// // 商户信息
// WrkInfoStoreRecord storeRecord = storeRecordService.getById(wrkId);
// // 工单信息
// WrkInfo wrkInfo = getById(wrkId);
// infoDetail.setInfoTerminal(BeanUtil.copyProperties(terminalRecord, WrkInfoTerminalVO.class));
// infoDetail.setInfoStore(BeanUtil.copyProperties(storeRecord, WrkInfoStoreVO.class));
// infoDetail.setWrkInfo(BeanUtil.copyProperties(wrkInfo, WrkInfoVO.class));
// 商户信息, 终端信息, 工单信息
WrkInfoDetailsVO infoDetail = baseMapper.getWrkInfoDetails(wrkId);
WrkInfoVO wrkInfo = infoDetail.getWrkInfo();
if (ObjectUtil.isEmpty(wrkInfo)) return infoDetail;
WrkInfoTerminalVO terminal = infoDetail.getInfoTerminal();
// 工单审核
List<WrkInfoAudit> auditList = infoAuditService.list(new LambdaQueryWrapper<WrkInfoAudit>()
.eq(WrkInfoAudit::getWrkId, wrkId));
infoDetail.setInfoAudit(BeanUtil.copyToList(auditList, AuditVO.class));
// 工单图片
List<WrkImg> imgList = wrkImgService.list(new LambdaQueryWrapper<WrkImg>()
.eq(WrkImg::getImgId, wrkId));
List<WrkImg> imgList = wrkImgService.list(new LambdaQueryWrapper<WrkImg>().eq(WrkImg::getImgId, wrkId));
infoDetail.setInfoImg(BeanUtil.copyToList(imgList, WrkImgVO.class));
// 内蒙古 五统一商户
if (terminalRecord.getTerminalId() != null && "建行内蒙古".equals(TaskConfigUtils.getConfig(wrkInfo.getTaskId()).getName())){
if (terminal.getTerminalId() != null && "建行内蒙古".equals(TaskConfigUtils.getConfig(wrkInfo.getTaskId()).getName())){
FiveStore fiveStore = fiveStoreService.getOne(new LambdaQueryWrapper<FiveStore>()
.eq(FiveStore::getTerminalId, terminalRecord.getTerminalId()).last(Operator.LIMIT_ONE.getCharacter()));
.eq(FiveStore::getTerminalId, terminal.getTerminalId()).last(Operator.LIMIT_ONE.getCharacter()));
infoDetail.setFiveStoreDetails(BeanUtil.copyProperties(fiveStore, FiveStoreVO.class));
}
// 门头照片
if (IPUtils.isMobile() && ObjectUtil.equals(wrkInfo.getWrkStatus(), 1) && terminalRecord.getTerminalId() != null) {
infoDetail.getWrkInfo().setDoorImage(wrkImgService.getOne(new LambdaQueryWrapper<WrkImg>()
.eq(WrkImg::getWrkId, wrkId)
.eq(WrkImg::getImgType, -1)
if (IPUtils.isMobile() && ObjectUtil.equals(wrkInfo.getWrkStatus(), 1) && terminal.getTerminalId() != null) {
infoDetail.getWrkInfo().setDoorImage(wrkImgService.getOne(new LambdaQueryWrapper<WrkImg>().eq(WrkImg::getWrkId, wrkId).eq(WrkImg::getImgType, -1)
.last(Operator.LIMIT_ONE.getCharacter())).getRealPath());
}
// 巡检单还没搞
infoDetail.setInspections(inspectionDataService.listInspections(wrkId));
return infoDetail;
}
@ -178,6 +182,66 @@ public class WrkInfoServiceImpl extends ServiceImpl<WrkInfoMapper, WrkInfo> impl
return List.of();
}
@Override
@DataScope(deptAlias = "i")
public Long downInspectionTemplate(ReviewedQuery query) {
// 先查询是否存在对应的记录
WrapperUtils.buildSql(query);
Page<WrkAuditVO> page = new Page<>(1, 1);
baseMapper.queryArchivePage(query, page);
// 必须 total 大于0, 才走下一步
AssertUtil.invalidate(page.getTotal() == 0, "下载信息为空");
DateUtils.format(LocalDate.now());
// 下载巡检单信息
Result<Long> task = remoteTaskService.createTask(CreateTaskDTO.builder()
.params(JSON.toJSONString(query))
.taskName(DateUtils.format(LocalDate.now()) + "-" + SecurityUtils.getUsername() + "-导出-" + query.getTaskId() + "-巡检单信息")
.applicationName(ServiceEnum.INSPECTION)
.methodName("downInspectionTemplate")
.className(this.getClass().getName())
.deptId(SecurityUtils.getDeptId())
.taskType(TaskTypeEnum.DOWN)
.remark("导出巡检单信息")
.createBy(SecurityUtils.getUsername())
.build(), SecurityConstants.INNER);
if (task.isSuccess() && task.getData() != null){
return task.getData();
}
throw new ResultException("创建后台任务异常");
}
/**
* 此处调用后台执行
*/
public Result<String> downInspectionTemplate(String params){
ReviewedQuery query = JSON.parseObject(params, ReviewedQuery.class);
// 先查询是否存在对应的记录
WrapperUtils.buildSql(query);
// 需要导出 工单信息
List<WrkInfoDetailsVO> wrkInfoDetailsVOS = baseMapper.listInsTemplate(query);
if (CollectionUtil.isEmpty(wrkInfoDetailsVOS)){
return Result.failed("查询工单为空");
}
// 工单map
Map<Long, WrkInfoDetailsVO> wrkMap =
wrkInfoDetailsVOS.stream().collect(Collectors.toMap(w -> w.getWrkInfo().getWrkId(), o -> o));
List<WrkImgVO> imgList = wrkImgService.listImgByWrkIds(wrkMap.keySet());
// 工单图片
// List<WrkImg> imgList = wrkImgService.list(new LambdaQueryWrapper<WrkImg>().in(WrkImg::getImgId, wrkMap.keySet()));
Map<Long, List<WrkImgVO>> imgMap = imgList.stream().collect(Collectors.groupingBy(WrkImgVO::getWrkId));
List<InspectionConfigVO> insConfigs = inspectionDataService.listInspections(wrkMap.keySet());
Map<Long, List<InspectionConfigVO>> configMap = insConfigs.stream().collect(Collectors.groupingBy(InspectionConfigVO::getWrkId));
wrkMap.forEach((wrkId, infoDetail)->{
List<WrkImgVO> wrkImgs = imgMap.get(wrkId);
infoDetail.setInfoImg(wrkImgs);
List<InspectionConfigVO> inspectionConfigVOS = configMap.get(wrkId);
infoDetail.setInspections(inspectionConfigVOS);
});
// 此处 去调用 生成 word 文档
// generatedIns.generated(wrkMap);
return Result.ok();
}
private WrkInfo makeWrkInfoEntity(DispatchDTO dispatch,DispatchQuery query,Long userId,String userName,Integer workMethod){
WrkInfo wrkInfo = new WrkInfo();
wrkInfo.setTaskId(query.getTaskId());
@ -213,7 +277,7 @@ public class WrkInfoServiceImpl extends ServiceImpl<WrkInfoMapper, WrkInfo> impl
Assert.notNull(userId, "【{}】未设置商户", dispatchDTO.getAccountManager());
// 组装wrkinfo实体
WrkInfo wrkInfo = makeWrkInfoEntity(dispatchDTO, query, userId,dispatchDTO.getAccountManager(),0);
wrkInfoService.save(wrkInfo);
save(wrkInfo);
//组装wrkterminal 实体
WrkInfoTerminalRecord wrkInfoTerminalRecord = BeanUtil.copyProperties(dispatchDTO, WrkInfoTerminalRecord.class);
wrkInfoTerminalRecord.setWrkId(wrkInfo.getWrkId());
@ -232,7 +296,7 @@ public class WrkInfoServiceImpl extends ServiceImpl<WrkInfoMapper, WrkInfo> impl
Assert.notNull(nickName, "【{}】未设置商户", dispatchDTO.getAccountManager());
WrkInfo wrkInfo = makeWrkInfoEntity(dispatchDTO, query, query.getUserId(), dispatchDTO.getAccountManager(), method);
// 组装wrkinfo实体
wrkInfoService.save(wrkInfo);
save(wrkInfo);
//组装wrkterminal 实体
WrkInfoTerminalRecord wrkInfoTerminalRecord = BeanUtil.copyProperties(dispatchDTO, WrkInfoTerminalRecord.class);
wrkInfoTerminalRecord.setWrkId(wrkInfo.getWrkId());

View File

@ -13,7 +13,7 @@ spring:
discovery:
server-addr: ${spring.cloud.nacos.server-addr}
namespace: ${nacos.namespace}
group: ${nacos.group}
group: local
service: ${spring.application.name}
config:
server-addr: ${spring.cloud.nacos.server-addr}

View File

@ -1,46 +1,59 @@
<?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.chushang.inspection.project.mapper.InspectionDataMapper">
<!-- 通用查询映射结果 -->
<resultMap id="inspectionConfigVOResult" type="com.chushang.inspection.work.vo.InspectionConfigVO">
<id column="config_id" property="configId"/>
<result column="config_name" property="configName"/>
<result column="alias" property="alias"/>
<result column="template" property="template"/>
<result column="template_url" property="templateUrl"/>
<collection property="details" ofType="com.chushang.inspection.work.vo.ConfigDataVO">
<id column="data_id" property="dataId"/>
<result column="detail_id" property="detailId"/>
<result column="config_key" property="configKey"/>
<result column="config_type" property="configType"/>
<result column="config_label" property="configLabel"/>
<result column="config_value" property="configValue"/>
<result column="remark" property="remark"/>
<result column="ins_id" property="wrkId"/>
</collection>
</resultMap>
<!-- 通用查询映射结果 -->
<resultMap id="inspectionConfigVOResult" type="com.chushang.inspection.work.vo.InspectionConfigVO">
<id column="config_id" property="configId" />
<result column="config_name" property="configName" />
<result column="alias" property="alias" />
<result column="template" property="template" />
<result column="template_url" property="templateUrl" />
<collection property="details" ofType="com.chushang.inspection.work.vo.ConfigDataVO">
<id column="data_id" property="dataId" />
<result column="detail_id" property="detailId" />
<result column="config_key" property="configKey" />
<result column="config_type" property="configType" />
<result column="config_label" property="configLabel" />
<result column="config_value" property="configValue" />
<result column="remark" property="remark" />
<result column="ins_id" property="wrkId" />
</collection>
</resultMap>
<select id="listInspections" resultMap="inspectionConfigVOResult">
SELECT id.data_id,
id.config_value,
id.remark,
id.ins_id,
idl.detail_id,
idl.config_key,
idl.config_type,
idl.config_label,
ic.config_id,
ic.template,
ic.alias,
ic.config_name,
ic.template_url
FROM inspection_data id
INNER JOIN inspection_detail idl ON id.detail_id = idl.detail_id
INNER JOIN inspection_config ic ON ic.config_id = idl.config_id
WHERE id.ins_id = #{wrkId}
<if test="true">
${query.sqlParam.get('dataScope')}
</if>
</select>
<select id="listInspectionsByWrkId" resultMap="inspectionConfigVOResult">
<include refid="listInspectionsSql"/>
AND id.ins_id = #{wrkId}
<if test="true">
${query.sqlParam.get('dataScope')}
</if>
</select>
<select id="listInspectionsByWrkIds" resultMap="inspectionConfigVOResult">
<include refid="listInspectionsSql"/>
AND id.ins_id IN
<foreach collection="wrkIds" separator="," close=")" open="(" item="wrkId">
#{wrkId}
</foreach>
<if test="true">
${query.sqlParam.get('dataScope')}
</if>
</select>
<sql id="listInspectionsSql">
SELECT id.data_id,
id.config_value,
id.remark,
id.ins_id,
idl.detail_id,
idl.config_key,
idl.config_type,
idl.config_label,
ic.config_id,
ic.template,
ic.alias,
ic.config_name,
ic.template_url
FROM inspection_data id
INNER JOIN inspection_detail idl ON id.detail_id = idl.detail_id
INNER JOIN inspection_config ic ON ic.config_id = idl.config_id
WHERE id.del_state = 0
</sql>
</mapper>

View File

@ -1,114 +1,246 @@
<?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.chushang.inspection.work.mapper.WrkInfoMapper">
<select id="queryDispatchPage" resultType="com.chushang.inspection.work.vo.WrkDispatchVO">
SELECT i.wrk_id AS wrkId,
i.user_name AS userName,
i.user_id AS userId,
i.dept_id AS deptId,
i.dept_name AS deptName,
i.work_type AS workType,
i.work_no AS workNo,
i.work_sort AS workSort,
i.remark AS remark,
i.end_time AS endTime,
i.create_time AS createTime,
i.create_by AS createBy,
isr.store_id AS storeId,
isr.store_no AS storeName,
isr.store_name AS storeNo,
itr.terminal_id AS terminalId,
itr.terminal_no AS terminalNo,
itr.terminal_sn AS terminalSn,
itr.terminal_type AS terminalType,
itr.terminal_model AS terminalModel
FROM `wrk_info` i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
<where>
<if test="1==1">
${query.sqlParam.get('sqlWhere')}
</if>
</where>
ORDER BY i.create_time desc
</select>
<select id="queryArchivePage" resultType="com.chushang.inspection.work.vo.WrkAuditVO">
SELECT i.wrk_id AS wrkId,
i.work_no AS workNo,
isr.store_no AS storeNo,
isr.store_id AS storeId,
i.user_id AS userId,
i.user_name AS userName,
itr.terminal_id AS terminalId,
itr.terminal_no AS terminalNo,
i.work_type AS workType,
isr.ins_fre AS insFre,
i.wrk_status AS wrkStatus,
isr.geographic_location AS geographicLocation,
isr.location_address AS locationAddress,
isr.deviation AS deviation,
i.dispose_time AS disposeTime,
i.create_by AS createBy,
i.create_time AS createTime,
i.task_id AS taskId,
i.task_name AS taskName,
i.lower_task_id AS lowerTaskId,
i.lower_task_name AS lowerTaskName
FROM wrk_info i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
<where>
<if test="1==1">
${query.sqlParam.get('sqlWhere')}
</if>
</where>
ORDER BY i.create_time desc
</select>
<select id="queryAppPage" resultType="com.chushang.inspection.work.vo.WrkListAppVO">
SELECT
i.wrk_id AS wrkId,
i.work_type AS workType,
i.task_name AS taskName,
isr.store_name AS storeName,
isr.store_contact AS storeContact,
isr.store_phone AS storePhone,
isr.ins_fre AS insFre,
itr.terminal_id AS terminalId,
itr.terminal_address AS terminalAddress,
(
SELECT count(w1.wrk_id)
FROM
wrk_info w1 INNER JOIN
wrk_info_terminal_record w2 ON w1.wrk_id = w2.wrk_id
WHERE w2.terminal_id = itr.terminal_id AND w1.wrk_status = #{query.wrkStatus}
) AS numberOfPickups,
(
SELECT w1.dispose_time
FROM
wrk_info w1 INNER JOIN
wrk_info_terminal_record w2 ON w1.wrk_id = w2.wrk_id
WHERE w2.terminal_id = itr.terminal_id
AND w1.wrk_status = #{query.wrkStatus} order by w1.dispose_time desc limit 1
) AS lastDisposeTime,
(
SELECT w1.service_result
FROM
wrk_info w1 INNER JOIN
wrk_info_terminal_record w2 ON w1.wrk_id = w2.wrk_id
WHERE w2.terminal_id = itr.terminal_id
AND w1.wrk_status = #{query.wrkStatus} order by w1.dispose_time desc limit 1
) AS lastServiceResult
FROM
wrk_info i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
<where>
<if test="1==1">
${query.sqlParam.get('sqlWhere')}
</if>
</where>
ORDER BY i.create_time desc
<select id="queryDispatchPage" resultType="com.chushang.inspection.work.vo.WrkDispatchVO">
SELECT i.wrk_id AS wrkId,
i.user_name AS userName,
i.user_id AS userId,
i.dept_id AS deptId,
i.dept_name AS deptName,
i.work_type AS workType,
i.work_no AS workNo,
i.work_sort AS workSort,
i.remark AS remark,
i.end_time AS endTime,
i.create_time AS createTime,
i.create_by AS createBy,
isr.store_id AS storeId,
isr.store_no AS storeName,
isr.store_name AS storeNo,
itr.terminal_id AS terminalId,
itr.terminal_no AS terminalNo,
itr.terminal_sn AS terminalSn,
itr.terminal_type AS terminalType,
itr.terminal_model AS terminalModel
FROM `wrk_info` i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
WHERE i.del_state = 0
<if test="1 == 1">
${query.sqlParam.get('sqlWhere')}
</if>
ORDER BY i.create_time desc
</select>
<select id="queryArchivePage" resultType="com.chushang.inspection.work.vo.WrkAuditVO">
SELECT i.wrk_id AS wrkId,
i.work_no AS workNo,
isr.store_no AS storeNo,
isr.store_id AS storeId,
i.user_id AS userId,
i.user_name AS userName,
itr.terminal_id AS terminalId,
itr.terminal_no AS terminalNo,
i.work_type AS workType,
isr.ins_fre AS insFre,
i.wrk_status AS wrkStatus,
isr.geographic_location AS geographicLocation,
isr.location_address AS locationAddress,
isr.deviation AS deviation,
i.dispose_time AS disposeTime,
i.create_by AS createBy,
i.create_time AS createTime,
i.task_id AS taskId,
i.task_name AS taskName,
i.lower_task_id AS lowerTaskId,
i.lower_task_name AS lowerTaskName
FROM wrk_info i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
where i.del_state = 0
<if test="1 == 1">
${query.sqlParam.get('sqlWhere')}
</if>
ORDER BY i.create_time desc
</select>
<select id="queryAppPage" resultType="com.chushang.inspection.work.vo.WrkListAppVO">
SELECT i.wrk_id AS wrkId,
i.work_type AS workType,
i.task_name AS taskName,
isr.store_name AS storeName,
isr.store_contact AS storeContact,
isr.store_phone AS storePhone,
isr.ins_fre AS insFre,
itr.terminal_id AS terminalId,
itr.terminal_address AS terminalAddress,
(SELECT count(w1.wrk_id)
FROM wrk_info w1
INNER JOIN
wrk_info_terminal_record w2 ON w1.wrk_id = w2.wrk_id
WHERE w2.terminal_id = itr.terminal_id
AND w1.wrk_status = #{query.wrkStatus}) AS numberOfPickups,
(SELECT w1.dispose_time
FROM wrk_info w1
INNER JOIN
wrk_info_terminal_record w2 ON w1.wrk_id = w2.wrk_id
WHERE w2.terminal_id = itr.terminal_id
AND w1.wrk_status = #{query.wrkStatus}
order by w1.dispose_time desc
limit 1) AS lastDisposeTime,
(SELECT w1.service_result
FROM wrk_info w1
INNER JOIN
wrk_info_terminal_record w2 ON w1.wrk_id = w2.wrk_id
WHERE w2.terminal_id = itr.terminal_id
AND w1.wrk_status = #{query.wrkStatus}
order by w1.dispose_time desc
limit 1) AS lastServiceResult
FROM wrk_info i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
where i.del_state = 0
<if test="1 == 1">
${query.sqlParam.get('sqlWhere')}
</if>
ORDER BY i.create_time desc
</select>
<resultMap id="wrkInfoDetailsVOResult" type="com.chushang.inspection.work.vo.WrkInfoDetailsVO">
<association property="wrkInfo" javaType="com.chushang.inspection.work.vo.WrkInfoVO">
<id column="wrk_id" property="wrkId" />
<result column="remark" property="remark" />
<result column="account_manager" property="accountManager" />
<result column="account_phone" property="accountPhone" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="dept_id" property="deptId" />
<result column="dept_name" property="deptName" />
<result column="dispose_time" property="disposeTime" />
<result column="end_time" property="endTime" />
<result column="lower_task_id" property="lowerTaskId" />
<result column="lower_task_name" property="lowerTaskName" />
<result column="service_result" property="serviceResult" />
<result column="task_id" property="taskId" />
<result column="task_name" property="taskName" />
<result column="user_id" property="userId" />
<result column="user_name" property="userName" />
<result column="work_method" property="workMethod" />
<result column="work_no" property="workNo" />
<result column="work_sort" property="workSort" />
<result column="work_source" property="workSource" />
<result column="work_type" property="workType" />
<result column="wrk_status" property="wrkStatus"/>
</association>
<association property="infoStore" javaType="com.chushang.inspection.work.vo.WrkInfoStoreVO">
<id column="store_id" property="storeId" />
<result column="deviation" property="deviation" />
<result column="geographic_location" property="geographicLocation" />
<result column="ins_fre" property="insFre" />
<result column="legal_name" property="legalName" />
<result column="location_address" property="locationAddress" />
<result column="pre_code_encoding" property="preCodeEncoding" />
<result column="products" property="products" />
<result column="register_address" property="registerAddress" />
<result column="shop_name" property="shopName" />
<result column="special_num" property="specialNum" />
<result column="store_address" property="storeAddress" />
<result column="store_contact" property="storeContact" />
<result column="store_name" property="storeName" />
<result column="store_no" property="storeNo" />
<result column="store_phone" property="storePhone" />
<result column="store_status" property="storeStatus" />
<result column="store_type" property="storeType" />
<result column="tip_tool" property="tipTool" />
<result column="work_adderss" property="workAddress" />
<result column="work_location" property="workLocation" />
</association>
<association property="infoTerminal" javaType="com.chushang.inspection.work.vo.WrkInfoTerminalVO">
<id column="terminal_id" property="terminalId" />
<result column="occupy" property="occupy" />
<result column="terminal_address" property="terminalAddress" />
<result column="terminal_model" property="terminalModel" />
<result column="terminal_no" property="terminalNo" />
<result column="terminal_property" property="terminalProperty" />
<result column="terminal_sn" property="terminalSn" />
<result column="terminal_source" property="terminalSource" />
<result column="terminal_status" property="terminalStatus" />
<result column="terminal_type" property="terminalType" />
<result column="terminal_version" property="terminalVersion" />
</association>
</resultMap>
<select id="listInsTemplate" resultType="com.chushang.inspection.work.vo.WrkInfoDetailsVO">
<include refid="wrkInfoDetailSql" />
<if test="1 == 1">
${query.sqlParam.get('sqlWhere')}
</if>
ORDER BY i.create_time desc
</select>
<select id="getWrkInfoDetails" resultMap="wrkInfoDetailsVOResult">
<include refid="wrkInfoDetailSql" />
AND i.wrk_id = #{wrkId}
ORDER BY i.create_time desc
</select>
<sql id="wrkInfoDetailSql">
SELECT
i.wrk_id,
i.`dept_id`,
i.`task_id`,
i.`lower_task_id`,
i.`user_id`,
i.`user_name`,
i.`work_no`,
i.`work_type`,
i.`work_method`,
i.`work_sort`,
i.`work_source`,
i.`dispose_time`,
i.`account_manager`,
i.`account_phone`,
i.`service_result`,
i.`remark`,
i.`end_time`,
i.`create_by`,
i.`create_time`,
i.`task_name`,
i.`lower_task_name`,
i.`dept_name`,
i.`wrk_status`,
isr.`store_id`,
isr.`store_status`,
isr.`store_no`,
isr.`store_name`,
isr.`store_contact`,
isr.`store_phone`,
isr.`store_address`,
isr.`special_num`,
isr.`shop_name`,
isr.`store_type`,
isr.`products`,
isr.`tip_tool`,
isr.`ins_fre`,
isr.`register_address`,
isr.`legal_name`,
isr.`geographic_location`,
isr.`location_address`,
isr.`work_location`,
isr.`work_adderss`,
isr.`deviation`,
isr.`pre_code_encoding`,
itr.`terminal_id`,
itr.`terminal_sn`,
itr.`terminal_type`,
itr.`terminal_model`,
itr.`terminal_no`,
itr.`terminal_source`,
itr.`terminal_address`,
itr.`terminal_version`,
itr.`terminal_property`,
itr.`occupy`,
itr.`terminal_status`
FROM
`wrk_info` i
INNER JOIN wrk_info_store_record isr ON i.wrk_id = isr.wrk_id
INNER JOIN wrk_info_terminal_record itr ON i.wrk_id = itr.wrk_id
WHERE i.del_state = 0
</sql>
</mapper>

View File

@ -0,0 +1,32 @@
import com.chushang.InspectionApplication;
import com.chushang.inspection.ins.GeneratedIns;
import com.chushang.inspection.work.service.WrkInfoService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* @auther: zhao
* @date: 2024/6/29 14:45
*/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = InspectionApplication.class)
public class GenInsTest {
@Resource
GeneratedIns generatedIns;
@Resource
WrkInfoService wrkInfoService;
@Test
public void genTest(){
// generatedIns.generated();
}
}