Browse Source

修改

dev^2
2 weeks ago
parent
commit
f079aab8dc
  1. 20
      application-tenant/tenant-admin/pom.xml
  2. 92
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java
  3. 14
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java
  4. 5
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysUserDto.java
  5. 4
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUser.java
  6. 2
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysUserVo.java
  7. 2
      application-tenant/tenant-admin/src/main/resources/application-config.yml
  8. 12
      common/common-association/src/main/java/apelet/association/controller/HomeController.java
  9. 60
      common/common-association/src/main/java/apelet/association/plugin/active/ActivityInfoDetailsPlugin.java
  10. 21
      common/common-association/src/main/java/apelet/association/plugin/active/ActivitySignConfigPlugin.java
  11. 76
      common/common-association/src/main/java/apelet/association/plugin/clueManage/ClueSaveOpPlugin.java
  12. 19
      common/common-association/src/main/java/apelet/association/plugin/quotation/ContractPlugin.java
  13. 82
      common/common-association/src/main/java/apelet/association/utils/WordDocUtil.java

20
application-tenant/tenant-admin/pom.xml

@ -25,6 +25,8 @@
<artifactId>mybatis-plus-generator</artifactId> <artifactId>mybatis-plus-generator</artifactId>
<version>${mybatisplus.version}</version> <version>${mybatisplus.version}</version>
</dependency> </dependency>
<!-- easypoi 内部已经依赖 poi 4.1.2,不要再单独引入poi/poi-ooxml!! -->
<dependency> <dependency>
<groupId>cn.afterturn</groupId> <groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId> <artifactId>easypoi-base</artifactId>
@ -40,6 +42,20 @@
<artifactId>easypoi-annotation</artifactId> <artifactId>easypoi-annotation</artifactId>
<version>4.4.0</version> <version>4.4.0</version>
</dependency> </dependency>
<!-- 关键补充:easypoi4.4.0缺少xmlbeans,DocumentHelper初始化失败就是缺这个 -->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
<dependency> <dependency>
<groupId>org.jetbrains</groupId> <groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId> <artifactId>annotations</artifactId>
@ -57,7 +73,7 @@
<dependency> <dependency>
<groupId>org.quartz-scheduler</groupId> <groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId> <artifactId>quartz</artifactId>
<version>2.3.2</version> <!-- 确保使用最新的稳定版本 --> <version>2.3.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mybatis</groupId> <groupId>org.mybatis</groupId>
@ -158,8 +174,6 @@
<version>1.0.0</version> <version>1.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>

92
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java

@ -70,6 +70,7 @@ import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* 登录接口控制器类 * 登录接口控制器类
* *
@ -138,6 +139,7 @@ public class LoginController {
private static final String SHOW_NAME_FIELD = "showName"; private static final String SHOW_NAME_FIELD = "showName";
private static final String SHOW_ORDER_FIELD = "showOrder"; private static final String SHOW_ORDER_FIELD = "showOrder";
private static final String HEAD_IMAGE_URL_FIELD = "headImageUrl"; private static final String HEAD_IMAGE_URL_FIELD = "headImageUrl";
private static final String SIGNATURE_IMAGE = "signatureImage";
private static final String THIRD_PARTY_CONFIG = "third_party_config"; private static final String THIRD_PARTY_CONFIG = "third_party_config";
@ -145,20 +147,18 @@ public class LoginController {
private OrmGenDataSourceUtil ormGenDataSourceUtil; private OrmGenDataSourceUtil ormGenDataSourceUtil;
@PostMapping("/getEhrLtpa") @PostMapping("/getEhrLtpa")
@NoAuthInterface @NoAuthInterface
public ResponseResult<JSONObject> getEhrLtap( public ResponseResult<JSONObject> getEhrLtap(
@MyRequestBody String username @MyRequestBody String username
){ ) {
EasConfig easConfig = ApplicationContextHolder.getBean("easConfig"); EasConfig easConfig = ApplicationContextHolder.getBean("easConfig");
String path = easConfig.getLtpaToken(); String path = easConfig.getLtpaToken();
// String path = "/ehrapp/yd/LtpaToken.properties"; // 测试环境地址 // String path = "/ehrapp/yd/LtpaToken.properties"; // 测试环境地址
System.out.println("getEasSsoUrl path = " + path); System.out.println("getEasSsoUrl path = " + path);
String password = LtpaTokenManager.generate(username, path).toString(); String password = LtpaTokenManager.generate(username, path).toString();
JSONObject jsonData = new JSONObject(); JSONObject jsonData = new JSONObject();
jsonData.put("ltap",password); jsonData.put("ltap", password);
return ResponseResult.success(jsonData); return ResponseResult.success(jsonData);
} }
@ -220,7 +220,7 @@ public class LoginController {
if (entryValue.get(entryFiledKey) instanceof ObjectValue) { if (entryValue.get(entryFiledKey) instanceof ObjectValue) {
ObjectValue entityValue = (ObjectValue) entryValue.get(entryFiledKey); ObjectValue entityValue = (ObjectValue) entryValue.get(entryFiledKey);
Long pk = entityValue.getPkValue(); Long pk = entityValue.getPkValue();
if (pk == null || pk == 0L) { if (pk == 0L) {
continue; continue;
} }
entityValue = ormGenDataSourceUtil.queryOne(entityValue.getTableName(), pk); entityValue = ormGenDataSourceUtil.queryOne(entityValue.getTableName(), pk);
@ -610,7 +610,7 @@ public class LoginController {
return; return;
} }
responseInfo.setDownloadUri("/tenantadmin/upms/login/downloadHeadImage"); responseInfo.setDownloadUri("/tenantadmin/upms/login/downloadHeadImage");
String newHeadImage = JSONArray.toJSONString(CollUtil.newArrayList(responseInfo)); String newHeadImage = JSON.toJSONString(CollUtil.newArrayList(responseInfo));
if (!sysUserService.changeHeadImage(TokenData.takeFromRequest().getUserId(), newHeadImage)) { if (!sysUserService.changeHeadImage(TokenData.takeFromRequest().getUserId(), newHeadImage)) {
ResponseResult.output(HttpServletResponse.SC_FORBIDDEN, ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST)); ResponseResult.output(HttpServletResponse.SC_FORBIDDEN, ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST));
return; return;
@ -657,7 +657,7 @@ public class LoginController {
log.info("Rest api login."); log.info("Rest api login.");
try { try {
// Object tokenObj = redissonClient.getBucket(appid).get(); // Object tokenObj = redissonClient.getBucket(appid).get();
String accessToken=""; String accessToken = "";
// if (tokenObj != null) { // if (tokenObj != null) {
// accessToken=tokenObj.toString(); // accessToken=tokenObj.toString();
// }else { // }else {
@ -669,7 +669,7 @@ public class LoginController {
paramMap.put("scope", "app"); paramMap.put("scope", "app");
// 发送 POST 请求 // 发送 POST 请求
String tokenData = HttpUtil.post(tokenUrl, paramMap); String tokenData = HttpUtil.post(tokenUrl, paramMap);
if (StringUtils.isBlank(tokenData)){ if (StringUtils.isBlank(tokenData)) {
return ResponseResult.error("500", "通过appId获取AccessToken失败,appId:" + appid); return ResponseResult.error("500", "通过appId获取AccessToken失败,appId:" + appid);
} }
JSONObject tokenJson = JSONObject.parseObject(tokenData); JSONObject tokenJson = JSONObject.parseObject(tokenData);
@ -679,10 +679,10 @@ public class LoginController {
accessToken = ((JSONObject) (tokenJson.get("data"))).get("accessToken").toString(); accessToken = ((JSONObject) (tokenJson.get("data"))).get("accessToken").toString();
//accessToken的有效时间为6400秒,在该有效期内多次获取均返回同一token, //accessToken的有效时间为6400秒,在该有效期内多次获取均返回同一token,
//连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为6200s //连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为6200s
redissonClient.getBucket(appid).set(accessToken,6200,TimeUnit.SECONDS); redissonClient.getBucket(appid).set(accessToken, 6200, TimeUnit.SECONDS);
// } // }
String jsonInputString = String.format("{\"appid\":\"%s\", \"ticket\":\"%s\"}", appid, ticket); String jsonInputString = String.format("{\"appid\":\"%s\", \"ticket\":\"%s\"}", appid, ticket);
String infoUrl="https://www.yunzhijia.com/gateway/ticket/user/acquirecontext?accessToken="+accessToken; String infoUrl = "https://www.yunzhijia.com/gateway/ticket/user/acquirecontext?accessToken=" + accessToken;
String userStr = HttpUtil.post(infoUrl, jsonInputString); String userStr = HttpUtil.post(infoUrl, jsonInputString);
log.info("validateHubCloudLogin appid:{}, ticket:{} ", appid, ticket); log.info("validateHubCloudLogin appid:{}, ticket:{} ", appid, ticket);
JSONObject userObj = JSONObject.parseObject(userStr); JSONObject userObj = JSONObject.parseObject(userStr);
@ -729,11 +729,11 @@ public class LoginController {
log.info("Rest api mlogin."); log.info("Rest api mlogin.");
try { try {
// Object tokenObj = redissonClient.getBucket(appid).get(); // Object tokenObj = redissonClient.getBucket(appid).get();
String accessToken=""; String accessToken = "";
// if (tokenObj != null) { // if (tokenObj != null) {
// accessToken=tokenObj.toString(); // accessToken=tokenObj.toString();
// }else { // }else {
if(StringUtils.isEmpty(appid)){ if (StringUtils.isEmpty(appid)) {
appid = hubCloudAppId; appid = hubCloudAppId;
} }
String tokenUrl = "https://www.yunzhijia.com/gateway/oauth2/token/getAccessToken"; String tokenUrl = "https://www.yunzhijia.com/gateway/oauth2/token/getAccessToken";
@ -744,7 +744,7 @@ public class LoginController {
paramMap.put("scope", "app"); paramMap.put("scope", "app");
// 发送 POST 请求 // 发送 POST 请求
String tokenData = HttpUtil.post(tokenUrl, paramMap); String tokenData = HttpUtil.post(tokenUrl, paramMap);
if (StringUtils.isBlank(tokenData)){ if (StringUtils.isBlank(tokenData)) {
return ResponseResult.error("500", "通过appId获取AccessToken失败,appId:" + appid); return ResponseResult.error("500", "通过appId获取AccessToken失败,appId:" + appid);
} }
JSONObject tokenJson = JSONObject.parseObject(tokenData); JSONObject tokenJson = JSONObject.parseObject(tokenData);
@ -754,10 +754,10 @@ public class LoginController {
accessToken = ((JSONObject) (tokenJson.get("data"))).get("accessToken").toString(); accessToken = ((JSONObject) (tokenJson.get("data"))).get("accessToken").toString();
//accessToken的有效时间为6400秒,在该有效期内多次获取均返回同一token, //accessToken的有效时间为6400秒,在该有效期内多次获取均返回同一token,
//连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为6200s //连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为6200s
redissonClient.getBucket(appid).set(accessToken,6200,TimeUnit.SECONDS); redissonClient.getBucket(appid).set(accessToken, 6200, TimeUnit.SECONDS);
// } // }
String jsonInputString = String.format("{\"appid\":\"%s\", \"ticket\":\"%s\"}", appid, ticket); String jsonInputString = String.format("{\"appid\":\"%s\", \"ticket\":\"%s\"}", appid, ticket);
String infoUrl="https://www.yunzhijia.com/gateway/ticket/user/acquirecontext?accessToken="+accessToken; String infoUrl = "https://www.yunzhijia.com/gateway/ticket/user/acquirecontext?accessToken=" + accessToken;
String userStr = HttpUtil.post(infoUrl, jsonInputString); String userStr = HttpUtil.post(infoUrl, jsonInputString);
log.info("validateHubCloudLogin appid:{}, ticket:{} ", appid, ticket); log.info("validateHubCloudLogin appid:{}, ticket:{} ", appid, ticket);
JSONObject userObj = JSONObject.parseObject(userStr); JSONObject userObj = JSONObject.parseObject(userStr);
@ -804,27 +804,27 @@ public class LoginController {
log.info("Rest api login."); log.info("Rest api login.");
try { try {
Object tokenObj = redissonClient.getBucket(appKey).get(); Object tokenObj = redissonClient.getBucket(appKey).get();
String accessToken=""; String accessToken = "";
if (tokenObj != null) { if (tokenObj != null) {
accessToken=tokenObj.toString(); accessToken = tokenObj.toString();
}else { } else {
String tokenUrl = "https://api.dingtalk.com/v1.0/oauth2/accessToken"; String tokenUrl = "https://api.dingtalk.com/v1.0/oauth2/accessToken";
String jsonInputString = String.format( String jsonInputString = String.format(
"{\"appKey\":\"%s\", \"appSecret\":\"%s\"}", "{\"appKey\":\"%s\", \"appSecret\":\"%s\"}",
appKey, dingTalkSecret); appKey, dingTalkSecret);
// 发送 POST 请求 // 发送 POST 请求
String tokenData = HttpUtil.post(tokenUrl, jsonInputString); String tokenData = HttpUtil.post(tokenUrl, jsonInputString);
if (StringUtils.isBlank(tokenData)){ if (StringUtils.isBlank(tokenData)) {
return ResponseResult.error("500", "通过appKey获取AccessToken失败,appKey:" + appKey); return ResponseResult.error("500", "通过appKey获取AccessToken失败,appKey:" + appKey);
} }
JSONObject tokenJson = JSONObject.parseObject(tokenData); JSONObject tokenJson = JSONObject.parseObject(tokenData);
accessToken = tokenJson.get("accessToken").toString(); accessToken = tokenJson.get("accessToken").toString();
//accessToken的有效时间为7200秒,在该有效期内多次获取均返回同一token, //accessToken的有效时间为7200秒,在该有效期内多次获取均返回同一token,
//连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为6200s //连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为6200s
redissonClient.getBucket(appKey).set(accessToken,7000,TimeUnit.SECONDS); redissonClient.getBucket(appKey).set(accessToken, 7000, TimeUnit.SECONDS);
} }
String jsonInputString = String.format("{\"code\":\"%s\"}",code); String jsonInputString = String.format("{\"code\":\"%s\"}", code);
String infoUrl="https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token="+accessToken; String infoUrl = "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token=" + accessToken;
String userStr = HttpUtil.post(infoUrl, jsonInputString); String userStr = HttpUtil.post(infoUrl, jsonInputString);
log.info("validateHubCloudLogin appKey:{}, code:{} ", appKey, code); log.info("validateHubCloudLogin appKey:{}, code:{} ", appKey, code);
JSONObject userObj = JSONObject.parseObject(userStr); JSONObject userObj = JSONObject.parseObject(userStr);
@ -841,7 +841,7 @@ public class LoginController {
if (user.getUserStatus() == SysUserStatus.STATUS_LOCKED) { if (user.getUserStatus() == SysUserStatus.STATUS_LOCKED) {
return ResponseResult.error(ErrorCodeEnum.INVALID_USER_STATUS, "登录失败,用户账号被锁定!"); return ResponseResult.error(ErrorCodeEnum.INVALID_USER_STATUS, "登录失败,用户账号被锁定!");
} }
JSONObject jsonData = this.buildLoginData(user,null,null); JSONObject jsonData = this.buildLoginData(user, null, null);
return ResponseResult.success(jsonData); return ResponseResult.success(jsonData);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -869,14 +869,14 @@ public class LoginController {
log.info("Rest api login."); log.info("Rest api login.");
try { try {
if(StringUtils.isBlank(ticket)){ if (StringUtils.isBlank(ticket)) {
return ResponseResult.error("500","ticket不能为空"); return ResponseResult.error("500", "ticket不能为空");
} }
String jsonInputString = String.format("{\"ticket\":\"%s\",\"appId\":\"%s\",\"checkType\":1}",ticket,appId); String jsonInputString = String.format("{\"ticket\":\"%s\",\"appId\":\"%s\",\"checkType\":1}", ticket, appId);
log.info("doLoginValidateDingTalkmJzt ", jsonInputString); log.info("doLoginValidateDingTalkmJzt ", jsonInputString);
String userStr = HttpUtil.post(ticketUrl, jsonInputString); String userStr = HttpUtil.post(ticketUrl, jsonInputString);
if(StringUtils.isBlank(userStr)){ if (StringUtils.isBlank(userStr)) {
return ResponseResult.error("500","ticket异常:"+ticket); return ResponseResult.error("500", "ticket异常:" + ticket);
} }
log.info(" get user result:", userStr); log.info(" get user result:", userStr);
JSONObject userObj = JSONObject.parseObject(userStr); JSONObject userObj = JSONObject.parseObject(userStr);
@ -896,7 +896,7 @@ public class LoginController {
return ResponseResult.success(jsonData); return ResponseResult.success(jsonData);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return ResponseResult.error("500", "自动登录失败:"+e.getMessage()); return ResponseResult.error("500", "自动登录失败:" + e.getMessage());
} }
} }
@ -1114,24 +1114,24 @@ public class LoginController {
} }
private String getShrRole(String zwcjName){ private String getShrRole(String zwcjName) {
String roleId = ""; String roleId = "";
if(!StringUtils.isEmpty(zwcjName)){ if (!StringUtils.isEmpty(zwcjName)) {
SysRole role = new SysRole(); SysRole role = new SysRole();
if(!zwcjName.equals("员工")){//非员工 if (!zwcjName.equals("员工")) {//非员工
role.setRoleName("非员工"); role.setRoleName("非员工");
List<SysRole> roleList = sysRoleService.getSysRoleList(role,""); List<SysRole> roleList = sysRoleService.getSysRoleList(role, "");
if(roleList.size() > 0){ if (roleList.size() > 0) {
roleId = roleId + roleList.get(0).getRoleId(); roleId = roleId + roleList.get(0).getRoleId();
} }
} }
role.setRoleName(zwcjName); role.setRoleName(zwcjName);
List<SysRole> roleList = sysRoleService.getSysRoleList(role,""); List<SysRole> roleList = sysRoleService.getSysRoleList(role, "");
if(roleList.size() > 0){ if (roleList.size() > 0) {
if(StringUtils.isEmpty(roleId)){ if (StringUtils.isEmpty(roleId)) {
roleId = roleList.get(0).getRoleId()+""; roleId = roleList.get(0).getRoleId() + "";
}else{ } else {
roleId = roleId +","+roleList.get(0).getRoleId(); roleId = roleId + "," + roleList.get(0).getRoleId();
} }
} }
} }
@ -1167,11 +1167,11 @@ public class LoginController {
if (mobileEntry.getPcurl() != null) { if (mobileEntry.getPcurl() != null) {
mobileEntry.setPcurl(EasUtil.getEasSsoUrl(user.getLoginName(), mobileEntry.getPcurl())); mobileEntry.setPcurl(EasUtil.getEasSsoUrl(user.getLoginName(), mobileEntry.getPcurl()));
} }
if(mobileEntry.getExtraUrl() != null){ if (mobileEntry.getExtraUrl() != null) {
if(mobileEntry.getExtraUrl().contains("?")){ if (mobileEntry.getExtraUrl().contains("?")) {
mobileEntry.setExtraUrl(mobileEntry.getExtraUrl()+"&userNumber="+user.getLoginName()); mobileEntry.setExtraUrl(mobileEntry.getExtraUrl() + "&userNumber=" + user.getLoginName());
}else{ } else {
mobileEntry.setExtraUrl(mobileEntry.getExtraUrl()+"?userNumber="+user.getLoginName()); mobileEntry.setExtraUrl(mobileEntry.getExtraUrl() + "?userNumber=" + user.getLoginName());
} }
} }
} }
@ -1201,7 +1201,7 @@ public class LoginController {
jsonData.put(IS_ADMIN, user.getUserType() == SysUserType.TYPE_ADMIN); jsonData.put(IS_ADMIN, user.getUserType() == SysUserType.TYPE_ADMIN);
if (user.getDeptId() != null) { if (user.getDeptId() != null) {
SysDept dept = sysDeptService.getById(user.getDeptId()); SysDept dept = sysDeptService.getById(user.getDeptId());
if(dept != null){ if (dept != null) {
jsonData.put("deptName", dept.getDeptName()); jsonData.put("deptName", dept.getDeptName());
} }

14
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java

@ -20,6 +20,7 @@ import apelet.tenantadmin.upms.model.SysUser;
import apelet.tenantadmin.upms.service.SysUserService; import apelet.tenantadmin.upms.service.SysUserService;
import apelet.tenantadmin.upms.vo.SysUserVo; import apelet.tenantadmin.upms.vo.SysUserVo;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import com.alibaba.fastjson.*; import com.alibaba.fastjson.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -225,7 +226,7 @@ public class SysUserController {
* @return 应答结果对象包含查询结果集 * @return 应答结果对象包含查询结果集
*/ */
@PostMapping("/list") @PostMapping("/list")
public ResponseResult<MyPageData<SysUserVo>> list( public ResponseResult<?> list(
@MyRequestBody SysUserDto sysUserDtoFilter, @MyRequestBody SysUserDto sysUserDtoFilter,
@MyRequestBody MyOrderParam orderParam, @MyRequestBody MyOrderParam orderParam,
@MyRequestBody MyPageParam pageParam) { @MyRequestBody MyPageParam pageParam) {
@ -235,7 +236,16 @@ public class SysUserController {
SysUser sysUserFilter = MyModelUtil.copyTo(sysUserDtoFilter, SysUser.class); SysUser sysUserFilter = MyModelUtil.copyTo(sysUserDtoFilter, SysUser.class);
String orderBy = MyOrderParam.buildOrderBy(orderParam, SysUser.class); String orderBy = MyOrderParam.buildOrderBy(orderParam, SysUser.class);
List<SysUser> sysUserList = sysUserService.getSysUserListWithRelation(sysUserFilter, orderBy); List<SysUser> sysUserList = sysUserService.getSysUserListWithRelation(sysUserFilter, orderBy);
return ResponseResult.success(MyPageUtil.makeResponseData(sysUserList, SysUser.INSTANCE));
MyPageData<SysUserVo> sysUserVoMyPageData = MyPageUtil.makeResponseData(sysUserList, SysUser.INSTANCE);
sysUserVoMyPageData.getDataList().forEach(f ->{
List<SysUser> collect = sysUserList.stream().filter(u -> f.getUserId().equals(u.getUserId())).collect(Collectors.toList());
SysUser sysUser = collect.get(0);
f.setSignatureImage(sysUser.getSignatureImage());
});
return ResponseResult.success(sysUserVoMyPageData);
} }

5
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysUserDto.java

@ -1,5 +1,7 @@
package apelet.tenantadmin.upms.dto; package apelet.tenantadmin.upms.dto;
import apelet.common.core.annotation.UploadFlagColumn;
import apelet.common.core.upload.UploadStoreTypeEnum;
import apelet.common.core.validator.AddGroup; import apelet.common.core.validator.AddGroup;
import apelet.common.core.validator.ConstDictRef; import apelet.common.core.validator.ConstDictRef;
import apelet.common.core.validator.UpdateGroup; import apelet.common.core.validator.UpdateGroup;
@ -70,6 +72,9 @@ public class SysUserDto {
@Schema(description = "用户头像的Url") @Schema(description = "用户头像的Url")
private String headImageUrl; private String headImageUrl;
@Schema(description = "签名")
private String signatureImage;
/** /**
* 用户状态(0: 正常 1: 锁定) * 用户状态(0: 正常 1: 锁定)
*/ */

4
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUser.java

@ -63,6 +63,10 @@ public class SysUser {
@UploadFlagColumn(storeType = UploadStoreTypeEnum.LOCAL_SYSTEM) @UploadFlagColumn(storeType = UploadStoreTypeEnum.LOCAL_SYSTEM)
private String headImageUrl; private String headImageUrl;
@UploadFlagColumn(storeType = UploadStoreTypeEnum.LOCAL_SYSTEM)
private String signatureImage;
/** /**
* 用户状态(0: 正常 1: 锁定) * 用户状态(0: 正常 1: 锁定)
*/ */

2
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysUserVo.java

@ -53,6 +53,8 @@ public class SysUserVo {
@Schema(description = "用户头像的Url") @Schema(description = "用户头像的Url")
private String headImageUrl; private String headImageUrl;
@Schema(description = "签名")
private String signatureImage;
/** /**
* 用户状态(0: 正常 1: 锁定) * 用户状态(0: 正常 1: 锁定)
*/ */

2
application-tenant/tenant-admin/src/main/resources/application-config.yml

@ -88,7 +88,7 @@ aliyun:
oss: oss:
enabled: true enabled: true
expireSeconds: 1000 expireSeconds: 1000
endpoint: https://oss-cn-beijing.aliyuncs.com endpoint: oss-cn-beijing.aliyuncs.com
accessKey: LTAI5t5fEgzRRtdmBvczVS6r accessKey: LTAI5t5fEgzRRtdmBvczVS6r
secretKey: uESFiyyi6EwCkM5w4a4pbx6TmVhqgx secretKey: uESFiyyi6EwCkM5w4a4pbx6TmVhqgx
bucketName: yy-test12 bucketName: yy-test12

12
common/common-association/src/main/java/apelet/association/controller/HomeController.java

@ -1,14 +1,21 @@
package apelet.association.controller; package apelet.association.controller;
import apelet.common.core.object.ObjectCollection; import apelet.association.utils.WordDocUtil;
import apelet.common.core.object.ResponseResult; import apelet.common.core.annotation.NoAuthInterface;
import apelet.common.core.object.*;
import apelet.common.generator.utils.OrmGenDataSourceUtil; import apelet.common.generator.utils.OrmGenDataSourceUtil;
import apelet.common.orm.impl.Filter; import apelet.common.orm.impl.Filter;
import apelet.common.orm.impl.FilterItem; import apelet.common.orm.impl.FilterItem;
import apelet.common.orm.impl.Selector; import apelet.common.orm.impl.Selector;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -68,4 +75,5 @@ public class HomeController {
} }
} }

60
common/common-association/src/main/java/apelet/association/plugin/active/ActivityInfoDetailsPlugin.java

@ -3,6 +3,7 @@ package apelet.association.plugin.active;
import apelet.association.utils.MyFileUtil; import apelet.association.utils.MyFileUtil;
import apelet.association.utils.QRCodeUtil; import apelet.association.utils.QRCodeUtil;
import apelet.common.core.exception.MyRuntimeException; import apelet.common.core.exception.MyRuntimeException;
import apelet.common.core.object.ObjectCollection;
import apelet.common.core.object.ObjectValue; import apelet.common.core.object.ObjectValue;
import apelet.common.core.upload.UploadResponseInfo; import apelet.common.core.upload.UploadResponseInfo;
import apelet.common.core.util.ApplicationContextHolder; import apelet.common.core.util.ApplicationContextHolder;
@ -27,7 +28,9 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 活动详情 * 活动详情
@ -59,14 +62,52 @@ public class ActivityInfoDetailsPlugin extends ListPlugin {
@Override @Override
public void change(String widgetVariableName, ObjectValue objectValue) { public void change(String widgetVariableName, ObjectValue objectValue) {
//添加 会员
if (widgetVariableName.equals("table1786587576012")) {
ObjectCollection memberInvitations = objectValue.getObjectCollection("member_invitation");
List<ObjectValue> collect = memberInvitations.stream().filter(f -> f.getString("rowkey").equals(objectValue.getString("rowkeysubset"))).collect(Collectors.toList());
if (!collect.isEmpty()) {
ObjectValue memberInvitation = collect.get(0);
ObjectValue membershipApplyId = memberInvitation.getObjectValue("membership_apply_id");
if (membershipApplyId == null) {
return;
}
ObjectValue membershipApply = ormGenDataSourceUtil.queryOne(membershipApplyId.getTableName(), membershipApplyId.getString("id"));
ObjectCollection applyEntry = membershipApply.getObjectCollection("membership_apply_entry");
if (applyEntry == null) {
return;
}
ObjectValue entryObject = applyEntry.getObject(0);
this.setWidgetAttributeByEntry("table1786587576012", "unit_name", AttributeEnum.VALUE_CHANGE, membershipApply.getString("unit_name"), objectValue.getString("rowkeysubset"));
this.setWidgetAttributeByEntry("table1786587576012", "person", AttributeEnum.VALUE_CHANGE, entryObject.getString("contact_name"), objectValue.getString("rowkeysubset"));
this.setWidgetAttributeByEntry("table1786587576012", "phone", AttributeEnum.VALUE_CHANGE, entryObject.getString("contact_phone"), objectValue.getString("rowkeysubset"));
}
}
//专家邀请
if(widgetVariableName.equals("table1786587648327")){
ObjectCollection expertInvitations = objectValue.getObjectCollection("expert_invitation");
List<ObjectValue> collect = expertInvitations.stream().filter(f -> f.getString("rowkey").equals(objectValue.getString("rowkeysubset"))).collect(Collectors.toList());
if (!collect.isEmpty()) {
ObjectValue expertInvitation = collect.get(0);
ObjectValue expert = expertInvitation.getObjectValue("expert_id");
expert = ormGenDataSourceUtil.queryOne(expert.getTableName(), expert.getString("id"));
this.setWidgetAttributeByEntry("table1786587648327", "person", AttributeEnum.VALUE_CHANGE, expert.getString("name"), objectValue.getString("rowkeysubset"));
this.setWidgetAttributeByEntry("table1786587648327", "phone", AttributeEnum.VALUE_CHANGE, expert.getString("phone"), objectValue.getString("rowkeysubset"));
}
}
//访客邀请
if(widgetVariableName.equals("table1786587726532")){
}
} }
@Override @Override
public void buttonTriggered(String widgetVariableName, ObjectValue objectValue) { public void buttonTriggered(String widgetVariableName, ObjectValue objectValue) {
// 生成报名二维码
if (widgetVariableName.equals("button1786587153460")) { if (widgetVariableName.equals("button1786587153460")) {
String registrationQr = objectValue.getString("registration_qr"); String registrationQr = objectValue.getString("registration_qr");
if(StringUtils.isNotEmpty(registrationQr)){ if (StringUtils.isNotEmpty(registrationQr)) {
this.showErrorMessage("当前已存在报名二维码, 请勿重复生成!!!"); this.showErrorMessage("当前已存在报名二维码, 请勿重复生成!!!");
return; return;
} }
@ -79,26 +120,31 @@ public class ActivityInfoDetailsPlugin extends ListPlugin {
// 生成 报名二维码 // 生成 报名二维码
long id = objectValue.getLong("id"); long id = objectValue.getLong("id");
String url = "http://58.48.135.5:8069" + "/#/?" + String url = "http://192.168.100.42:8099" + "/#/?" +
"loginName=" + "admin" + "loginName=" + "admin" +
"&password=" + "123456" + "&password=" + "123456" +
"&entryId=" + "2087413611113746432" + "&entryId=" + "2087710350152568832" +
"&bindType=" + "1" + "&bindType=" + "1" +
"&onlineFormId=" + "2087385700075835392" + "&onlineFormId=" + "2048951917157027840" +
"&activeId=" + id; "&activeId=" + id;
byte[] checkInQr = qrCodeUtil.generateQrCode(url, 350, 350); byte[] checkInQr = qrCodeUtil.generateQrCode(url, 350, 350);
QRFile = MyFileUtil.writeToFile(checkInQr, savePath, "qrcode-" + System.currentTimeMillis() + ".png"); QRFile = MyFileUtil.writeToFile(checkInQr, savePath, "qrcode-" + System.currentTimeMillis() + ".png");
MultipartFile checkInMultipart = MyFileUtil.readFileAsMultipartFile(QRFile, "image/png"); MultipartFile checkInMultipart = MyFileUtil.readFileAsMultipartFile(QRFile, "image/png");
UploadResponseInfo registrationQR = myFileUtil.uploadMyFile(table, "registration_qr", true, checkInMultipart); UploadResponseInfo registrationQR = myFileUtil.uploadMyFile(table, "qr", true, checkInMultipart);
this.setWidgetAttribute("registrationQr", AttributeEnum.VALUE_CHANGE, registrationQR);
String s = "[" + new JSONObject(BeanUtil.beanToMap(registrationQR)).toJSONString() + "]";
this.setWidgetAttribute("registrationQr", AttributeEnum.VALUE_CHANGE, s);
this.setWidgetAttribute("qr", AttributeEnum.VALUE_CHANGE, s);
objectValue.put("registration_qr", "["+new JSONObject(BeanUtil.beanToMap(registrationQR)).toJSONString()+"]"); objectValue.put("registration_qr", s);
objectValue.put("qr", s);
Selector selector = new Selector(); Selector selector = new Selector();
selector.getList().add(new SelectorItem("registration_qr")); selector.getList().add(new SelectorItem("registration_qr"));
ormGenDataSourceUtil.update(objectValue.getTableName(), objectValue, selector); ormGenDataSourceUtil.update(objectValue.getTableName(), objectValue, selector);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
throw new MyRuntimeException(e.getMessage()); throw new MyRuntimeException(e.getMessage());
} finally { } finally {
QRFile.delete(); QRFile.delete();

21
common/common-association/src/main/java/apelet/association/plugin/active/ActivitySignConfigPlugin.java

@ -102,16 +102,16 @@ public class ActivitySignConfigPlugin extends ListPlugin {
Model model = dto.getModel(); Model model = dto.getModel();
if ("button1778742711763".equals(widgetVariableName)) { if ("button1778742711763".equals(widgetVariableName)) {
if (StringUtils.isNotBlank(objectValue.getString("sign_in_code")) && // if (StringUtils.isNotBlank(objectValue.getString("sign_in_code")) &&
StringUtils.isNotBlank(objectValue.getString("sign_out_code"))) { // StringUtils.isNotBlank(objectValue.getString("sign_out_code"))) {
showWarningMessage("当前已存在二维码, 请勿重复生产!!!"); // showWarningMessage("当前已存在二维码, 请勿重复生产!!!");
return; // return;
} // }
// 生成二维码 // 生成二维码
String savePath = System.getProperty("user.dir") + "\\zz-resource\\qrcode"; String savePath = System.getProperty("user.dir") + "\\zz-resource\\qrcode";
File checkOutFile; File checkOutFile = null;
File checkInFile; File checkInFile = null;
try { try {
Object activityId = objectValue.get("id"); Object activityId = objectValue.get("id");
Object activityName = objectValue.get("name"); Object activityName = objectValue.get("name");
@ -135,13 +135,6 @@ public class ActivitySignConfigPlugin extends ListPlugin {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
throw new MyRuntimeException("二维码生成失败, 请联系管理员!!!"); throw new MyRuntimeException("二维码生成失败, 请联系管理员!!!");
} finally {
try {
FileUtils.cleanDirectory(new File(savePath));
} catch (IOException e) {
e.printStackTrace();
System.err.println("文件刪除失敗!!!");
}
} }
} }
} }

76
common/common-association/src/main/java/apelet/association/plugin/clueManage/ClueSaveOpPlugin.java

@ -0,0 +1,76 @@
package apelet.association.plugin.clueManage;
import apelet.common.core.exception.MyRuntimeException;
import apelet.common.core.object.ObjectCollection;
import apelet.common.core.object.ObjectValue;
import apelet.common.core.object.TokenData;
import apelet.common.core.util.ApplicationContextHolder;
import apelet.common.generator.utils.OrmGenDataSourceUtil;
import apelet.common.online.plugin.*;
import apelet.common.orm.impl.Selector;
import apelet.common.orm.impl.SelectorItem;
import cn.hutool.core.date.DateUtil;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @ClassName: ClueActivateOpPlugin
* @Author: lihuangbin
* @Date: 2026/5/11
* @Description: 激活放弃的线索
*/
public class ClueSaveOpPlugin extends OperationServicePlugIn {
private final OrmGenDataSourceUtil ormGenDataSourceUtil;
private final RedissonClient redissonClient;
public ClueSaveOpPlugin() {
ormGenDataSourceUtil = ApplicationContextHolder.getBean(OrmGenDataSourceUtil.class);
redissonClient = ApplicationContextHolder.getBean(RedissonClient.class);
}
@Override
public void endOperationTransaction(EndOperationTransactionArgs e) {
ObjectValue objectValue = e.getModel();
String redisKey = "clue -- " + DateUtil.today();
RBucket<Map<Long, Map<Long, String>>> bucket = redissonClient.getBucket(redisKey);
Map<Long, Map<Long, String>> map;
// 修复:key存在则读取,不存在新建空map
if (bucket.isExists()) {
map = bucket.get();
} else {
map = new HashMap<>();
}
Long userId = TokenData.takeFromRequest().getUserId();
Map<Long, String> userClueMap = map.get(userId);
if (userClueMap == null || userClueMap.isEmpty()) {
userClueMap = new HashMap<>();
}
String context = "完成线索, 名称: " +objectValue.getString("name")
+ ", 咨询内容: " + objectValue.getString("seek_info");
userClueMap.put(objectValue.getLong("id"), context);
map.put(userId, userClueMap);
bucket.set(map);
// 判断:key不存在,写入同时设置过期;key已经存在,只更新value,**不修改TTL**
if (!bucket.isExists()) {
// 计算到次日0点毫秒
LocalDateTime tomorrowZero = LocalDate.now().plusDays(1).atStartOfDay();
long expireMs = ChronoUnit.MILLIS.between(LocalDateTime.now(), tomorrowZero);
// 原子:只有key不存在才写入并设置过期
bucket.expire(expireMs, TimeUnit.MILLISECONDS);
}
}
}

19
common/common-association/src/main/java/apelet/association/plugin/quotation/ContractPlugin.java

@ -1,9 +1,14 @@
package apelet.association.plugin.quotation; package apelet.association.plugin.quotation;
import apelet.association.utils.WordDocUtil;
import apelet.common.core.object.ObjectValue;
import apelet.common.online.abstractplugin.ListPlugin; import apelet.common.online.abstractplugin.ListPlugin;
import apelet.common.orm.impl.Filter; import apelet.common.orm.impl.Filter;
import apelet.common.orm.impl.FilterItem; import apelet.common.orm.impl.FilterItem;
import java.time.LocalDate;
import java.util.Map;
/* /*
合同列表界面设置过滤条件 合同列表界面设置过滤条件
@ -15,4 +20,18 @@ public class ContractPlugin extends ListPlugin {
filter.add(new FilterItem("status", FilterItem.equals, "3")); filter.add(new FilterItem("status", FilterItem.equals, "3"));
return filter; return filter;
} }
@Override
public void buttonTriggered(String widgetVariableName, ObjectValue objectValue) {
if(widgetVariableName.equals("合同导出")){
try {
Map values = objectValue.getValues();
String template = System.getProperty("user.dir") + "\\zz-resource\\quotation_template.docx";
String outPath = System.getProperty("user.dir") + "\\zz-resource\\quotation_"+ System.currentTimeMillis()+".docx";
WordDocUtil.renderLocalDoc(template, outPath, values);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
} }

82
common/common-association/src/main/java/apelet/association/utils/WordDocUtil.java

@ -0,0 +1,82 @@
package apelet.association.utils;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import java.io.*;
import java.util.Map;
public class WordDocUtil {
/**
* 本地模板生成docx文件输出到本地磁盘
*
* @param templateLocalPath 本地模板绝对路径
* @param outLocalPath 输出文件路径
* @param dataMap 填充数据
* @throws Exception IO异常
*/
public static void renderLocalDoc(String templateLocalPath, String outLocalPath, Map<String, Object> dataMap) throws Exception {
// 自动创建输出文件夹
File outFile = new File(outLocalPath);
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdirs();
}
Configure config = Configure.builder()
.buildGramer("#{", "}")
.build();
try (InputStream templateIn = new FileInputStream(templateLocalPath);
OutputStream fileOut = new FileOutputStream(outLocalPath);
XWPFTemplate template = XWPFTemplate.compile(templateIn, config).render(dataMap)) {
template.write(fileOut);
}
}
/**
* 新增模板渲染直接输出到输出流用于浏览器下载不生成本地临时文件
* @param templateLocalPath 模板文件路径
* @param outputStream response.getOutputStream()
* @param dataMap 填充数据
* @throws Exception ex
*/
public static void renderToOutputStream(String templateLocalPath, OutputStream outputStream, Map<String, Object> dataMap) throws Exception {
Configure config = Configure.builder()
.buildGramer("#{", "}")
.build();
try (InputStream templateIn = new FileInputStream(templateLocalPath);
XWPFTemplate template = XWPFTemplate.compile(templateIn, config).render(dataMap)) {
template.write(outputStream);
}
}
/**
* OSS/网络URL图片构建签字图片专用
*
* @param ossUrl OSS完整图片地址 https://xxx.oss-cn-beijing.aliyuncs.com/sign/sign001.png
* @param widthCm 图片宽度 单位cm
* @param heightCm 图片高度 单位cm
* @return PictureRenderData
*/
public static PictureRenderData getOssPic(String ossUrl, double widthCm, double heightCm) {
// poi‑tl size 参数单位是 像素,注意:不是厘米!!!
return Pictures.ofUrl(ossUrl)
.size((int) widthCm, (int) heightCm)
.create();
}
// 本地图片(备用)
public static PictureRenderData getLocalPic(String imgLocalPath, double width, double height) {
return Pictures.ofLocal(imgLocalPath).size((int) width, (int) height).create();
}
// base64图片(备用)
public static PictureRenderData getBase64Pic(String base64Str, double width, double height) {
return Pictures.ofBase64(base64Str, PictureType.PNG)
.size((int) width, (int) height)
.create();
}
}
Loading…
Cancel
Save