Merge branch 'prod/20260407' into test

This commit is contained in:
曹鹏飞 2026-04-09 17:30:32 +08:00
commit 846efe55bc
12 changed files with 157 additions and 63 deletions

View File

@ -125,22 +125,6 @@
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alimt20181012</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.3.9</version>
<exclusions>
<exclusion>
<artifactId>dom4j</artifactId>
<groupId>org.dom4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>

View File

@ -0,0 +1,24 @@
package com.nflg.mobilebroken.admin.config;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.repository.service.ILanguageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Slf4j
@Component
public class SystemConfig {
@Resource
private ILanguageService languageService;
@PostConstruct
public void initData() {
languageService.list().forEach(language -> {
Constant.LANGUAGE_ALIYUN_MAP.put(language.getCode(),language.getTranslateCode());
});
}
}

View File

@ -17,7 +17,7 @@ import java.io.OutputStream;
*/
@RestController
@RequestMapping("/test")
public class TestController extends ControllerBase{
public class TestController extends ControllerBase {
@Resource
private DeviceQRCodeService deviceQRCodeService;
@ -71,4 +71,12 @@ public class TestController extends ControllerBase{
public ApiResult<String> deepseekTranslate(@RequestParam String text, @RequestParam String targetLanguage) {
return ApiResult.success(deepSeekTranslate.translateWord(text, "auto", targetLanguage, "html"));
}
/**
* 抛错
*/
@GetMapping("throwError")
public void throwError() {
VUtils.trueThrowBusinessError(true).throwMessage("抛错");
}
}

View File

@ -11,7 +11,6 @@ import com.nflg.mobilebroken.admin.annotation.ApiMark;
import com.nflg.mobilebroken.admin.publisher.TicketEventPublisher;
import com.nflg.mobilebroken.admin.service.ShengWangService;
import com.nflg.mobilebroken.admin.service.SsePushService;
import com.nflg.mobilebroken.admin.service.impl.AliYunTranslate;
import com.nflg.mobilebroken.common.constant.*;
import com.nflg.mobilebroken.common.exception.NflgException;
import com.nflg.mobilebroken.common.pojo.ApiResult;
@ -24,6 +23,7 @@ import com.nflg.mobilebroken.repository.entity.*;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
import com.nflg.mobilebroken.starter.service.UniPushService;
import com.nflg.mobilebroken.starter.service.impl.AliYunTranslate;
import com.nflg.mobilebroken.starter.service.impl.DeepSeekTranslate;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;

View File

@ -0,0 +1,24 @@
package com.nflg.mobilebroken.cfs.config;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.repository.service.ILanguageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Slf4j
@Component
public class SystemConfig {
@Resource
private ILanguageService languageService;
@PostConstruct
public void initData() {
languageService.list().forEach(language -> {
Constant.LANGUAGE_ALIYUN_MAP.put(language.getCode(),language.getTranslateCode());
});
}
}

View File

@ -1,12 +1,17 @@
package com.nflg.mobilebroken.common.constant;
import cn.hutool.setting.Setting;
import java.util.HashMap;
import java.util.Map;
public class Constant {
public static final String FROM_APP = "app";
public static final String FROM_ADMIN = "admin";
public static final String DEFAULT_LANGUAGE_CODE="cn";
public static final String DEFAULT_LANGUAGE_CODE = "cn";
public static final String DICTIONARY_TYPE_SERVICE_EVALUATION = "ServiceEvaluation";
@ -36,58 +41,57 @@ public class Constant {
public static final String WX_QRCODE = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
public static final String DICTIONARY_EMAIL_NOTIFY ="EmailContent";
public static final String DICTIONARY_EMAIL_NOTIFY = "EmailContent";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE="TitleTicketCreate";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE = "TitleTicketCreate";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED="TitleTicketAssigned";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED = "TitleTicketAssigned";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_Complete = "TitleTicketComplete";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_CHANGE_EMAIL="TitleChangeEmail";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_CHANGE_EMAIL = "TitleChangeEmail";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY="TitleTicketReply";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY = "TitleTicketReply";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT="TitleTicketTimeout";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT = "TitleTicketTimeout";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_INVITE_COMMENT="TitleInviteComment";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_INVITE_COMMENT = "TitleInviteComment";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY="TicketNotify";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY = "TicketNotify";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_CHANGE_EMAIL="ChangeEmail";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_CHANGE_EMAIL = "ChangeEmail";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_INVITE_COMMENT="InviteComment";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_INVITE_COMMENT = "InviteComment";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD="TitleResetPassword";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD = "TitleResetPassword";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_CHANGE_PASSWORD="TitleChangePassword";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_CHANGE_PASSWORD = "TitleChangePassword";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION="TitleAccountActivation";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION = "TitleAccountActivation";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY="ResetPassword";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY = "ResetPassword";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_CHANGE_PASSWORD="ChangePassword";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_CHANGE_PASSWORD = "ChangePassword";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY="AccountActivation";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY = "AccountActivation";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE="TitleTicketClose";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE = "TitleTicketClose";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN="TitleTicketReopen";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE_GONGFU="TitleTicketCreateGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED_GONGFU="TitleTicketAssignedGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY_GONGFU="TitleTicketReplyGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT_GONGFU="TitleTicketTimeoutGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_COMPLETE_GONGFU="TitleTicketCompleteGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN_GONGFU="TitleTicketReopenGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE_GONGFU="TitleTicketCloseGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN = "TitleTicketReopen";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CREATE_GONGFU = "TitleTicketCreateGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED_GONGFU = "TitleTicketAssignedGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY_GONGFU = "TitleTicketReplyGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT_GONGFU = "TitleTicketTimeoutGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_COMPLETE_GONGFU = "TitleTicketCompleteGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REOPEN_GONGFU = "TitleTicketReopenGongfu";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_CLOSE_GONGFU = "TitleTicketCloseGongfu";
/**
* 事业部部长
*/
public static final String TITLE_DIRECTOROF_BUSINESS_UNIT="YDP-001";
public static final String TITLE_DIRECTOROF_BUSINESS_UNIT = "YDP-001";
/**
* 技术主管
@ -114,17 +118,17 @@ public class Constant {
*/
public static final String ROLE_CODE_ACCOUNT_REVIEW = "AccountReview";
public static final String DICTIONARY_SYSTEMERROR ="SystemErrorMessage";
public static final String DICTIONARY_SYSTEMERROR = "SystemErrorMessage";
public static final String DICTIONARY_ITEM_INCORRECTUSERNAMEORPASSWORD="IncorrectUsernameOrPassword";
public static final String DICTIONARY_ITEM_INCORRECTUSERNAMEORPASSWORD = "IncorrectUsernameOrPassword";
public static final String DICTIONARY_ITEM_ACCOUNT_DISABLED="AccountDisabled";
public static final String DICTIONARY_ITEM_ACCOUNT_DISABLED = "AccountDisabled";
public static final String DICTIONARY_ITEM_ACCOUNT_NOT_ACTIVATED="AccountNotActivated";
public static final String DICTIONARY_ITEM_ACCOUNT_NOT_ACTIVATED = "AccountNotActivated";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_PRIMARY="AccountHasExpiredPrimary";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_PRIMARY = "AccountHasExpiredPrimary";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED="AccountHasExpired";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED = "AccountHasExpired";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_ENDUSER = "EndUserAccountHasExpired";
@ -132,20 +136,20 @@ public class Constant {
public static final String DICTIONARY_SOLUTION_REVIEW_DEPARTMENT = "SolutionReviewDepartment";
public static final String DICTIONARY_DEVICE_STATE ="deviceState";
public static final String DICTIONARY_DEVICE_STATE = "deviceState";
public static final String DICTIONARY_DEVICE_WARRANTY_STATE ="deviceWarrantyState";
public static final String DICTIONARY_DEVICE_WARRANTY_STATE = "deviceWarrantyState";
public static final String DICTIONARY_DEVICE_PART_TYPE_ATTR ="PartTypeAttr";
public static final String DICTIONARY_DEVICE_PART_TYPE_ATTR = "PartTypeAttr";
public static final String DICTIONARY_AD_TYPE ="AdvertisementType";
public static final String DICTIONARY_AD_TYPE = "AdvertisementType";
public static final String DICTIONARY_AD_POSITION ="AdvertisementPosition";
public static final String DICTIONARY_AD_POSITION = "AdvertisementPosition";
public static final String DICTIONARY_SERVICE = "SystemService";
public static final String DICTIONARY_PRODUCT_MODEL_MAIN_PARAMS ="ProductModelMainParams";
public static final String DICTIONARY_PRODUCT_MODEL_MAIN_PARAMS = "ProductModelMainParams";
public static final String DICTIONARY_PRODUCT_INTRO_CATEGORY ="ProductIntroCategory";
public static final String DICTIONARY_PRODUCT_INTRO_CATEGORY = "ProductIntroCategory";
public static final String DICTIONARY_PRODUCT_MODULE = "ProductModule";
@ -173,4 +177,5 @@ public class Constant {
public static final Integer TICKET_TYPE_MOBILE_BROKEN = 0;
public static final Integer TICKET_TYPE_GONGFU = 1;
public static final Map<String, String> LANGUAGE_ALIYUN_MAP = new HashMap<>();
}

View File

@ -7,11 +7,13 @@ import com.nflg.mobilebroken.repository.entity.Device;
import com.nflg.mobilebroken.repository.entity.GongfuDevice;
import com.nflg.mobilebroken.repository.service.IDeviceService;
import com.nflg.mobilebroken.repository.service.IGongfuDeviceService;
import com.nflg.mobilebroken.repository.service.ILanguageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@ -24,6 +26,9 @@ public class SystemConfig {
@Resource
private IGongfuDeviceService deviceService;
@Resource
private ILanguageService languageService;
@PostConstruct
public void initData() {
log.info("初始化产品线列表");
@ -46,5 +51,8 @@ public class SystemConfig {
.collect(Collectors.toSet())
);
log.info("产品线列表:{}", StrUtil.join(",", Constant1.PRODUCT_LINE));
languageService.list().forEach(language -> {
Constant.LANGUAGE_ALIYUN_MAP.put(language.getCode(),language.getTranslateCode());
});
}
}

View File

@ -32,6 +32,11 @@ public class TicketSolutionAudit implements Serializable {
*/
private Long ticketId;
/**
* 部门id
*/
private Long deptId;
/**
* 部门名称
*/

View File

@ -1,6 +1,7 @@
package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.constant.Constant;
@ -51,9 +52,9 @@ public class TicketSolutionAuditServiceImpl extends ServiceImpl<TicketSolutionAu
private IAdminUserService adminUserService;
@Override
public List<SolutionReviewDepartmentVO> getByTicket(Long ticketId,String languageCode) {
public List<SolutionReviewDepartmentVO> getByTicket(Long ticketId, String languageCode) {
List<DictionaryItem> items = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_SOLUTION_REVIEW_DEPARTMENT, languageCode);
List<SolutionReviewDepartmentVO> vos = baseMapper.getByTicket(ticketId,languageCode);
List<SolutionReviewDepartmentVO> vos = baseMapper.getByTicket(ticketId, languageCode);
items.forEach(item -> {
if (vos.stream().noneMatch(vo -> vo.getDeptName().equals(item.getName()))) {
SolutionReviewDepartmentVO vo = new SolutionReviewDepartmentVO();
@ -75,10 +76,16 @@ public class TicketSolutionAuditServiceImpl extends ServiceImpl<TicketSolutionAu
List<TicketSolutionAudit> forAdd = new ArrayList<>();
List<TicketSolutionAudit> forUpdate = new ArrayList<>();
Ticket ticket = ticketService.getById(request.getTicketId());
List<DictionaryItem> dictionaryItems = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_SOLUTION_REVIEW_DEPARTMENT);
request.getDepartments().forEach(detp -> {
TicketSolutionAudit audit = new TicketSolutionAudit();
if (Objects.isNull(detp.getId())) {
DictionaryItem dept = dictionaryItems.stream()
.filter(item -> StrUtil.equals(item.getName(), detp.getDeptName()))
.findFirst()
.orElse(null);
audit.setTicketId(Long.valueOf(request.getTicketId()));
audit.setDeptId(Objects.isNull(dept) ? null : dept.getId().longValue());
audit.setDeptName(detp.getDeptName());
audit.setUserId(detp.getUserId());
audit.setCreateTime(LocalDateTime.now());

View File

@ -112,6 +112,22 @@
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alimt20181012</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.3.9</version>
<exclusions>
<exclusion>
<artifactId>dom4j</artifactId>
<groupId>org.dom4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>

View File

@ -6,6 +6,8 @@ import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.exception.NflgException;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.starter.service.impl.AliYunTranslate;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Value;
@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import javax.annotation.Resource;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.sql.SQLException;
@ -30,6 +33,9 @@ import java.util.stream.Collectors;
@Slf4j
public class GlobalRestControllerAdvice {
@Resource
private AliYunTranslate aliYunTranslate;
@Value("${spring.servlet.multipart.max-file-size}")
private DataSize maxFileSize;
@ -52,6 +58,13 @@ public class GlobalRestControllerAdvice {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ex.getMessage());
} else {
log.error("业务错误: ", ex);
String languageCode = MultilingualUtil.getLanguage();
if (!StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode)) {
return ResponseEntity.ok().body(ApiResult.error(ex.getState(), aliYunTranslate.translateWord(ex.getMessage(), aliyunCode)));
}
}
return ResponseEntity.ok().body(ApiResult.error(ex.getState(), ex.getMessage()));
}
}

View File

@ -1,4 +1,4 @@
package com.nflg.mobilebroken.admin.service.impl;
package com.nflg.mobilebroken.starter.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;