diff --git a/application-tenant/tenant-admin/pom.xml b/application-tenant/tenant-admin/pom.xml index b2ab632..9c94759 100644 --- a/application-tenant/tenant-admin/pom.xml +++ b/application-tenant/tenant-admin/pom.xml @@ -25,6 +25,8 @@ mybatis-plus-generator ${mybatisplus.version} + + cn.afterturn easypoi-base @@ -40,6 +42,20 @@ easypoi-annotation 4.4.0 + + + + org.apache.xmlbeans + xmlbeans + 3.1.0 + + + + cn.hutool + hutool-all + 5.8.26 + + org.jetbrains annotations @@ -57,7 +73,7 @@ org.quartz-scheduler quartz - 2.3.2 + 2.3.2 org.mybatis @@ -158,8 +174,6 @@ 1.0.0 - - @@ -171,4 +185,4 @@ - \ No newline at end of file + diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java index 970b03b..7387b36 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/LoginController.java +++ b/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.concurrent.TimeUnit; 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_ORDER_FIELD = "showOrder"; 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"; @@ -145,20 +147,18 @@ public class LoginController { private OrmGenDataSourceUtil ormGenDataSourceUtil; - - @PostMapping("/getEhrLtpa") @NoAuthInterface public ResponseResult getEhrLtap( @MyRequestBody String username - ){ + ) { EasConfig easConfig = ApplicationContextHolder.getBean("easConfig"); String path = easConfig.getLtpaToken(); // String path = "/ehrapp/yd/LtpaToken.properties"; // 测试环境地址 System.out.println("getEasSsoUrl path = " + path); String password = LtpaTokenManager.generate(username, path).toString(); JSONObject jsonData = new JSONObject(); - jsonData.put("ltap",password); + jsonData.put("ltap", password); return ResponseResult.success(jsonData); } @@ -220,7 +220,7 @@ public class LoginController { if (entryValue.get(entryFiledKey) instanceof ObjectValue) { ObjectValue entityValue = (ObjectValue) entryValue.get(entryFiledKey); Long pk = entityValue.getPkValue(); - if (pk == null || pk == 0L) { + if (pk == 0L) { continue; } entityValue = ormGenDataSourceUtil.queryOne(entityValue.getTableName(), pk); @@ -610,7 +610,7 @@ public class LoginController { return; } 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)) { ResponseResult.output(HttpServletResponse.SC_FORBIDDEN, ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST)); return; @@ -657,7 +657,7 @@ public class LoginController { log.info("Rest api login."); try { // Object tokenObj = redissonClient.getBucket(appid).get(); - String accessToken=""; + String accessToken = ""; // if (tokenObj != null) { // accessToken=tokenObj.toString(); // }else { @@ -669,7 +669,7 @@ public class LoginController { paramMap.put("scope", "app"); // 发送 POST 请求 String tokenData = HttpUtil.post(tokenUrl, paramMap); - if (StringUtils.isBlank(tokenData)){ + if (StringUtils.isBlank(tokenData)) { return ResponseResult.error("500", "通过appId获取AccessToken失败,appId:" + appid); } JSONObject tokenJson = JSONObject.parseObject(tokenData); @@ -679,10 +679,10 @@ public class LoginController { accessToken = ((JSONObject) (tokenJson.get("data"))).get("accessToken").toString(); //accessToken的有效时间为6400秒,在该有效期内多次获取均返回同一token, //连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为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 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); log.info("validateHubCloudLogin appid:{}, ticket:{} ", appid, ticket); JSONObject userObj = JSONObject.parseObject(userStr); @@ -729,11 +729,11 @@ public class LoginController { log.info("Rest api mlogin."); try { // Object tokenObj = redissonClient.getBucket(appid).get(); - String accessToken=""; + String accessToken = ""; // if (tokenObj != null) { // accessToken=tokenObj.toString(); // }else { - if(StringUtils.isEmpty(appid)){ + if (StringUtils.isEmpty(appid)) { appid = hubCloudAppId; } String tokenUrl = "https://www.yunzhijia.com/gateway/oauth2/token/getAccessToken"; @@ -744,7 +744,7 @@ public class LoginController { paramMap.put("scope", "app"); // 发送 POST 请求 String tokenData = HttpUtil.post(tokenUrl, paramMap); - if (StringUtils.isBlank(tokenData)){ + if (StringUtils.isBlank(tokenData)) { return ResponseResult.error("500", "通过appId获取AccessToken失败,appId:" + appid); } JSONObject tokenJson = JSONObject.parseObject(tokenData); @@ -754,10 +754,10 @@ public class LoginController { accessToken = ((JSONObject) (tokenJson.get("data"))).get("accessToken").toString(); //accessToken的有效时间为6400秒,在该有效期内多次获取均返回同一token, //连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为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 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); log.info("validateHubCloudLogin appid:{}, ticket:{} ", appid, ticket); JSONObject userObj = JSONObject.parseObject(userStr); @@ -804,27 +804,27 @@ public class LoginController { log.info("Rest api login."); try { Object tokenObj = redissonClient.getBucket(appKey).get(); - String accessToken=""; + String accessToken = ""; if (tokenObj != null) { - accessToken=tokenObj.toString(); - }else { + accessToken = tokenObj.toString(); + } else { String tokenUrl = "https://api.dingtalk.com/v1.0/oauth2/accessToken"; String jsonInputString = String.format( "{\"appKey\":\"%s\", \"appSecret\":\"%s\"}", appKey, dingTalkSecret); // 发送 POST 请求 String tokenData = HttpUtil.post(tokenUrl, jsonInputString); - if (StringUtils.isBlank(tokenData)){ + if (StringUtils.isBlank(tokenData)) { return ResponseResult.error("500", "通过appKey获取AccessToken失败,appKey:" + appKey); } JSONObject tokenJson = JSONObject.parseObject(tokenData); accessToken = tokenJson.get("accessToken").toString(); //accessToken的有效时间为7200秒,在该有效期内多次获取均返回同一token, //连许多次请求会被拦截,因此需要本地缓存。为防止极端情况,设置过期时间为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 infoUrl="https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token="+accessToken; + String jsonInputString = String.format("{\"code\":\"%s\"}", code); + String infoUrl = "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token=" + accessToken; String userStr = HttpUtil.post(infoUrl, jsonInputString); log.info("validateHubCloudLogin appKey:{}, code:{} ", appKey, code); JSONObject userObj = JSONObject.parseObject(userStr); @@ -841,7 +841,7 @@ public class LoginController { if (user.getUserStatus() == SysUserStatus.STATUS_LOCKED) { 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); } catch (Exception e) { e.printStackTrace(); @@ -869,14 +869,14 @@ public class LoginController { log.info("Rest api login."); try { - if(StringUtils.isBlank(ticket)){ - return ResponseResult.error("500","ticket不能为空"); + if (StringUtils.isBlank(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); String userStr = HttpUtil.post(ticketUrl, jsonInputString); - if(StringUtils.isBlank(userStr)){ - return ResponseResult.error("500","ticket异常:"+ticket); + if (StringUtils.isBlank(userStr)) { + return ResponseResult.error("500", "ticket异常:" + ticket); } log.info(" get user result:", userStr); JSONObject userObj = JSONObject.parseObject(userStr); @@ -896,7 +896,7 @@ public class LoginController { return ResponseResult.success(jsonData); } catch (Exception e) { 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 = ""; - if(!StringUtils.isEmpty(zwcjName)){ + if (!StringUtils.isEmpty(zwcjName)) { SysRole role = new SysRole(); - if(!zwcjName.equals("员工")){//非员工 + if (!zwcjName.equals("员工")) {//非员工 role.setRoleName("非员工"); - List roleList = sysRoleService.getSysRoleList(role,""); - if(roleList.size() > 0){ + List roleList = sysRoleService.getSysRoleList(role, ""); + if (roleList.size() > 0) { roleId = roleId + roleList.get(0).getRoleId(); } } role.setRoleName(zwcjName); - List roleList = sysRoleService.getSysRoleList(role,""); - if(roleList.size() > 0){ - if(StringUtils.isEmpty(roleId)){ - roleId = roleList.get(0).getRoleId()+""; - }else{ - roleId = roleId +","+roleList.get(0).getRoleId(); + List roleList = sysRoleService.getSysRoleList(role, ""); + if (roleList.size() > 0) { + if (StringUtils.isEmpty(roleId)) { + roleId = roleList.get(0).getRoleId() + ""; + } else { + roleId = roleId + "," + roleList.get(0).getRoleId(); } } } @@ -1167,11 +1167,11 @@ public class LoginController { if (mobileEntry.getPcurl() != null) { mobileEntry.setPcurl(EasUtil.getEasSsoUrl(user.getLoginName(), mobileEntry.getPcurl())); } - if(mobileEntry.getExtraUrl() != null){ - if(mobileEntry.getExtraUrl().contains("?")){ - mobileEntry.setExtraUrl(mobileEntry.getExtraUrl()+"&userNumber="+user.getLoginName()); - }else{ - mobileEntry.setExtraUrl(mobileEntry.getExtraUrl()+"?userNumber="+user.getLoginName()); + if (mobileEntry.getExtraUrl() != null) { + if (mobileEntry.getExtraUrl().contains("?")) { + mobileEntry.setExtraUrl(mobileEntry.getExtraUrl() + "&userNumber=" + user.getLoginName()); + } else { + mobileEntry.setExtraUrl(mobileEntry.getExtraUrl() + "?userNumber=" + user.getLoginName()); } } } @@ -1201,7 +1201,7 @@ public class LoginController { jsonData.put(IS_ADMIN, user.getUserType() == SysUserType.TYPE_ADMIN); if (user.getDeptId() != null) { SysDept dept = sysDeptService.getById(user.getDeptId()); - if(dept != null){ + if (dept != null) { jsonData.put("deptName", dept.getDeptName()); } @@ -1532,6 +1532,6 @@ public class LoginController { private List permCodeList; private List permList; } - + } diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java index a19d724..2d00389 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysUserController.java +++ b/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.vo.SysUserVo; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ReflectUtil; import com.alibaba.fastjson.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -225,7 +226,7 @@ public class SysUserController { * @return 应答结果对象,包含查询结果集。 */ @PostMapping("/list") - public ResponseResult> list( + public ResponseResult list( @MyRequestBody SysUserDto sysUserDtoFilter, @MyRequestBody MyOrderParam orderParam, @MyRequestBody MyPageParam pageParam) { @@ -235,7 +236,16 @@ public class SysUserController { SysUser sysUserFilter = MyModelUtil.copyTo(sysUserDtoFilter, SysUser.class); String orderBy = MyOrderParam.buildOrderBy(orderParam, SysUser.class); List sysUserList = sysUserService.getSysUserListWithRelation(sysUserFilter, orderBy); - return ResponseResult.success(MyPageUtil.makeResponseData(sysUserList, SysUser.INSTANCE)); + + MyPageData sysUserVoMyPageData = MyPageUtil.makeResponseData(sysUserList, SysUser.INSTANCE); + sysUserVoMyPageData.getDataList().forEach(f ->{ + List 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); + + } diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysUserDto.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysUserDto.java index e096b69..86f1feb 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysUserDto.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/dto/SysUserDto.java @@ -1,5 +1,7 @@ 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.ConstDictRef; import apelet.common.core.validator.UpdateGroup; @@ -70,6 +72,9 @@ public class SysUserDto { @Schema(description = "用户头像的Url") private String headImageUrl; + @Schema(description = "签名") + private String signatureImage; + /** * 用户状态(0: 正常 1: 锁定)。 */ diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUser.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUser.java index e1ed6fb..85dba06 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/model/SysUser.java +++ b/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) private String headImageUrl; + + @UploadFlagColumn(storeType = UploadStoreTypeEnum.LOCAL_SYSTEM) + private String signatureImage; + /** * 用户状态(0: 正常 1: 锁定)。 */ diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysUserVo.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysUserVo.java index 25c11ea..0125b29 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysUserVo.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/vo/SysUserVo.java @@ -53,6 +53,8 @@ public class SysUserVo { @Schema(description = "用户头像的Url") private String headImageUrl; + @Schema(description = "签名") + private String signatureImage; /** * 用户状态(0: 正常 1: 锁定)。 */ diff --git a/application-tenant/tenant-admin/src/main/resources/application-config.yml b/application-tenant/tenant-admin/src/main/resources/application-config.yml index f0748e1..b51ea11 100644 --- a/application-tenant/tenant-admin/src/main/resources/application-config.yml +++ b/application-tenant/tenant-admin/src/main/resources/application-config.yml @@ -88,7 +88,7 @@ aliyun: oss: enabled: true expireSeconds: 1000 - endpoint: https://oss-cn-beijing.aliyuncs.com + endpoint: oss-cn-beijing.aliyuncs.com accessKey: LTAI5t5fEgzRRtdmBvczVS6r secretKey: uESFiyyi6EwCkM5w4a4pbx6TmVhqgx bucketName: yy-test12 diff --git a/common/common-association/src/main/java/apelet/association/controller/HomeController.java b/common/common-association/src/main/java/apelet/association/controller/HomeController.java index 794bb3b..370cee8 100644 --- a/common/common-association/src/main/java/apelet/association/controller/HomeController.java +++ b/common/common-association/src/main/java/apelet/association/controller/HomeController.java @@ -1,14 +1,21 @@ package apelet.association.controller; -import apelet.common.core.object.ObjectCollection; -import apelet.common.core.object.ResponseResult; +import apelet.association.utils.WordDocUtil; +import apelet.common.core.annotation.NoAuthInterface; +import apelet.common.core.object.*; import apelet.common.generator.utils.OrmGenDataSourceUtil; import apelet.common.orm.impl.Filter; import apelet.common.orm.impl.FilterItem; 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -68,4 +75,5 @@ public class HomeController { } + } diff --git a/common/common-association/src/main/java/apelet/association/plugin/active/ActivityInfoDetailsPlugin.java b/common/common-association/src/main/java/apelet/association/plugin/active/ActivityInfoDetailsPlugin.java index e3736ec..018c538 100644 --- a/common/common-association/src/main/java/apelet/association/plugin/active/ActivityInfoDetailsPlugin.java +++ b/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.QRCodeUtil; import apelet.common.core.exception.MyRuntimeException; +import apelet.common.core.object.ObjectCollection; import apelet.common.core.object.ObjectValue; import apelet.common.core.upload.UploadResponseInfo; import apelet.common.core.util.ApplicationContextHolder; @@ -27,7 +28,9 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 活动详情 @@ -59,14 +62,52 @@ public class ActivityInfoDetailsPlugin extends ListPlugin { @Override public void change(String widgetVariableName, ObjectValue objectValue) { + //添加 会员 + if (widgetVariableName.equals("table1786587576012")) { + ObjectCollection memberInvitations = objectValue.getObjectCollection("member_invitation"); + List 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 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 public void buttonTriggered(String widgetVariableName, ObjectValue objectValue) { + // 生成报名二维码 if (widgetVariableName.equals("button1786587153460")) { String registrationQr = objectValue.getString("registration_qr"); - if(StringUtils.isNotEmpty(registrationQr)){ + if (StringUtils.isNotEmpty(registrationQr)) { this.showErrorMessage("当前已存在报名二维码, 请勿重复生成!!!"); return; } @@ -79,26 +120,31 @@ public class ActivityInfoDetailsPlugin extends ListPlugin { // 生成 报名二维码 long id = objectValue.getLong("id"); - String url = "http://58.48.135.5:8069" + "/#/?" + + String url = "http://192.168.100.42:8099" + "/#/?" + "loginName=" + "admin" + "&password=" + "123456" + - "&entryId=" + "2087413611113746432" + + "&entryId=" + "2087710350152568832" + "&bindType=" + "1" + - "&onlineFormId=" + "2087385700075835392" + + "&onlineFormId=" + "2048951917157027840" + "&activeId=" + id; byte[] checkInQr = qrCodeUtil.generateQrCode(url, 350, 350); QRFile = MyFileUtil.writeToFile(checkInQr, savePath, "qrcode-" + System.currentTimeMillis() + ".png"); MultipartFile checkInMultipart = MyFileUtil.readFileAsMultipartFile(QRFile, "image/png"); - UploadResponseInfo registrationQR = myFileUtil.uploadMyFile(table, "registration_qr", true, checkInMultipart); - this.setWidgetAttribute("registrationQr", AttributeEnum.VALUE_CHANGE, registrationQR); + UploadResponseInfo registrationQR = myFileUtil.uploadMyFile(table, "qr", true, checkInMultipart); + + 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.getList().add(new SelectorItem("registration_qr")); ormGenDataSourceUtil.update(objectValue.getTableName(), objectValue, selector); } catch (Exception e) { + e.printStackTrace(); throw new MyRuntimeException(e.getMessage()); } finally { QRFile.delete(); diff --git a/common/common-association/src/main/java/apelet/association/plugin/active/ActivitySignConfigPlugin.java b/common/common-association/src/main/java/apelet/association/plugin/active/ActivitySignConfigPlugin.java index 73d6f9a..4c40e69 100644 --- a/common/common-association/src/main/java/apelet/association/plugin/active/ActivitySignConfigPlugin.java +++ b/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(); if ("button1778742711763".equals(widgetVariableName)) { - if (StringUtils.isNotBlank(objectValue.getString("sign_in_code")) && - StringUtils.isNotBlank(objectValue.getString("sign_out_code"))) { - showWarningMessage("当前已存在二维码, 请勿重复生产!!!"); - return; - } +// if (StringUtils.isNotBlank(objectValue.getString("sign_in_code")) && +// StringUtils.isNotBlank(objectValue.getString("sign_out_code"))) { +// showWarningMessage("当前已存在二维码, 请勿重复生产!!!"); +// return; +// } // 生成二维码 String savePath = System.getProperty("user.dir") + "\\zz-resource\\qrcode"; - File checkOutFile; - File checkInFile; + File checkOutFile = null; + File checkInFile = null; try { Object activityId = objectValue.get("id"); Object activityName = objectValue.get("name"); @@ -135,13 +135,6 @@ public class ActivitySignConfigPlugin extends ListPlugin { } catch (Exception e) { e.printStackTrace(); throw new MyRuntimeException("二维码生成失败, 请联系管理员!!!"); - } finally { - try { - FileUtils.cleanDirectory(new File(savePath)); - } catch (IOException e) { - e.printStackTrace(); - System.err.println("文件刪除失敗!!!"); - } } } } diff --git a/common/common-association/src/main/java/apelet/association/plugin/clueManage/ClueSaveOpPlugin.java b/common/common-association/src/main/java/apelet/association/plugin/clueManage/ClueSaveOpPlugin.java new file mode 100644 index 0000000..d5d6a7d --- /dev/null +++ b/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>> bucket = redissonClient.getBucket(redisKey); + Map> map; + // 修复:key存在则读取,不存在新建空map + if (bucket.isExists()) { + map = bucket.get(); + } else { + map = new HashMap<>(); + } + Long userId = TokenData.takeFromRequest().getUserId(); + Map 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); + } + } + + +} diff --git a/common/common-association/src/main/java/apelet/association/plugin/quotation/ContractPlugin.java b/common/common-association/src/main/java/apelet/association/plugin/quotation/ContractPlugin.java index d423550..6380ec7 100644 --- a/common/common-association/src/main/java/apelet/association/plugin/quotation/ContractPlugin.java +++ b/common/common-association/src/main/java/apelet/association/plugin/quotation/ContractPlugin.java @@ -1,9 +1,14 @@ 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.orm.impl.Filter; 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")); 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); + } + } + } } diff --git a/common/common-association/src/main/java/apelet/association/utils/WordDocUtil.java b/common/common-association/src/main/java/apelet/association/utils/WordDocUtil.java new file mode 100644 index 0000000..1ac88b2 --- /dev/null +++ b/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 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 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(); + } + +}