diff --git a/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/HuaWeiSmsUtil.java b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/HuaWeiSmsUtil.java new file mode 100644 index 00000000..9b387a03 --- /dev/null +++ b/jero-boot-base/jero-boot-base-core/src/main/java/com/jero/common/util/HuaWeiSmsUtil.java @@ -0,0 +1,330 @@ +package com.jero.common.util; + +//如果JDK版本低于1.8,请使用三方库提供Base64类 +//import org.apache.commons.codec.binary.Base64; + +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSON; +import com.jero.common.exception.JeroBootException; +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.*; +/** + * @作者:WangHK + * @类名:HuaWeiMSGSMS + * @功能:TODO_华为短信 + * @日期:2021年6月20日 + * @公司:天津合众未来科技有限公司 + */ +@Component +public class HuaWeiSmsUtil { + @Autowired + private RedisUtil redisUtil; + //无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值 + private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\""; + //无需修改,用于格式化鉴权头域,给"Authorization"参数赋值 + private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\""; + public static final String BASE_NUMBER = "123456789"; + @Value("${huaWeiSms.url}") + private String url; + @Value("${huaWeiSms.appKey}") + private String appKey; + @Value("${huaWeiSms.appSecret}") + private String appSecret; + @Value("${huaWeiSms.open}") + private boolean open; + + /** + * @param phone 手机号 + * @param codeType 类型: + * 1.登录检查验证码_验证码类 + * 2.忘记密码_验证码类 + * 3.会员到期提醒_通知类 + * 4.发票邮寄通知提醒_通知类 + * @param codeTime 失效时间 + * 条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 + * 国际/港澳台短信不用关注该参数 + * 失效时间为0时不存redis + * @param templateParas 传递参数,通知类需要 + */ + public Boolean sendVerificationCode(String phone, String codeType, String codeTime,String templateParas) { + String sender; //通道 + String templateId; //模板 + String signature; //签名名称 + //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 + //随机生成6位数字 + String randomNumber = RandomUtil.randomString(BASE_NUMBER,6); + //设置短信有效时间 + codeTime = this.resRedisTime(codeTime); + //传进来为秒数所以除以60 + String verificationTime = this.resVerificationTime(codeTime); + //解密手机号 + phone = PasswordUtil.decrypt(phone); + long expire = redisUtil.getExpire("_verification:_phone:" + phone); + //值为-2代表没有此数据 + if (expire != -2){ + if (600 - expire <= 60){ + throw new JeroBootException("1分钟内只能发送一次验证码"); + } + } + switch (codeType) { + case "1": + //中汽标协-登录检查验证码 + sender = "8821062807743"; + signature = "中汽标协"; + templateId = "9fbee7166af24bbfacc178e417345a21"; + templateParas = "[" + randomNumber + "," + phone + "," + verificationTime + "]"; + break; + case "2": + //中汽标协-忘记密码 + sender = "8821062807743"; + signature = "中汽标协"; + templateId = "6f8573c5adc54df2a56a6e48556c3044"; + templateParas = "[" + randomNumber + "," + phone + "," + verificationTime + "]"; + break; + case "3": + //中汽标协-会员到期提醒 + sender = "8821062807762"; + signature = "中汽标协"; + templateId = "3c6321febaa84fecb68d6b0f5bbc0754"; + //通知类短信,不需要存redis + codeTime = "0"; + break; + case "4": + //中汽标协-发票邮寄通知提醒 + sender = "8821062807762"; + signature = "中汽标协"; + templateId = "077964a02a814149bb01900e43c9a04e"; + codeTime = "0"; + break; + default: + throw new JeroBootException("codeType flase."); + } + //调用华为短信发送 + return this.huaWeiSendSms(phone, codeTime, url, appKey, appSecret, templateParas,sender, templateId, signature,randomNumber); + } + + /** + * 调用华为短信发送 + * + * @param phone 手机号 + * @param codeTime 失效时间 + * @param url APP接入地址+接口访问URI + * @param appKey APP_Key + * @param appSecret APP_Secret + * @param sender 通道 + * @param templateId 模板 + * @param signature 签名名称 + * @return + */ + public Boolean huaWeiSendSms(String phone, String codeTime, String url, String appKey, String appSecret, + String templateParas, String sender, String templateId, String signature,String randomNumber) { + //必填,全局号码格式(包含国家码),示例:+86151****6789,多个号码之间用英文逗号分隔 +// String receiver = "151****6789"; //短信接收人号码 + //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 + String statusCallBack = ""; + + /** + * 选填,使用无变量模板时请赋空值 String templateParas = ""; + * 单变量模板示例:模板内容为"您的验证码是${1}"时,templateParas可填写为"[\"369751\"]" + * 双变量模板示例:模板内容为"您有${1}件快递请到${2}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]" + * 模板中的每个变量都必须赋值,且取值不能为空 + * 查看更多模板和变量规范:产品介绍>模板和变量规范 + */ + + //请求Body,不携带签名名称时,signature请填null + String body = this.resBody(sender, phone, templateId, templateParas, statusCallBack, signature); + + //请求Headers中的X-WSSE参数值 + String wsseHeader = this.resWsseHeader(appKey, appSecret); + + this.sendSms(url, wsseHeader, body, phone, randomNumber, codeTime); + return Boolean.TRUE; + } + + public String resRedisTime(String codeTime) { + //如果没有设置验证码失效时间默认600秒 + if (StringUtils.isBlank(codeTime)) { + codeTime = "600"; + } + return codeTime; + } + + /** + * 设置短信有效时间 + */ + public String resVerificationTime(String codeTime) { + //如果没有设置验证码失效时间默认600秒 + if (StringUtils.isBlank(codeTime)) { + codeTime = "600"; + } + //传进来为秒数所以除以60 + int time = Integer.parseInt(codeTime) / 60; + return String.valueOf(time); + } + + /** + * 请求Body,不携带签名名称时,signature请填null + */ + public String resBody(String sender, String phone, String templateId, String templateParas, String statusCallBack, String signature) { + String body = buildRequestBody(sender, phone, templateId, templateParas, statusCallBack, signature); + if (null == body || body.isEmpty()) { + throw new JeroBootException("body is null."); + } + return body; + } + + /** + * 请求Headers中的X-WSSE参数值 + */ + public String resWsseHeader(String appKey, String appSecret) { + String wsseHeader = buildWsseHeader(appKey, appSecret); + if (null == wsseHeader || wsseHeader.isEmpty()) { + throw new JeroBootException("wsse header is null."); + } + return wsseHeader; + } + + public void sendSms(String url, String wsseHeader, String body, String phone, String randomNumber, String codeTime) { + try { + //如果JDK版本低于1.8,可使用如下代码 + //CloseableHttpClient client = HttpClients.custom() + // .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { + // @Override + // public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + // return true; + // } + // }).build()).setSSLHostnameVerifier(new DefaultHostnameVerifier()).build(); + + //如果JDK版本是1.8,可使用如下代码 + CloseableHttpClient client = null; + try { + client = HttpClients.custom() + .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, + (x509CertChain, authType) -> true).build()) + .setSSLHostnameVerifier(new DefaultHostnameVerifier()) + .build(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (KeyStoreException e) { + e.printStackTrace(); + } + if (open){ + HttpResponse response = null; + response = client.execute(RequestBuilder.create("POST")//请求方法POST + .setUri(url) + .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE) + .addHeader("X-WSSE", wsseHeader) + .setEntity(new StringEntity(body)).build()); + + //判断发送是否成功 + String result = EntityUtils.toString(response.getEntity()); + String code = JSON.parseObject(result).getString("code"); + String description = JSON.parseObject(result).getString("description"); + if (!"000000".equals(code) || !"Success".equals(description)) { + throw new JeroBootException("发送短信失败!"); + } + } + //如果时间为0是通知类短信,不需要存redis + if (!"0".equals(codeTime)){ + if (!redisUtil.set("_verification:_phone:" + phone, randomNumber, Long.valueOf(codeTime))) { + throw new JeroBootException("redis false."); + } + } +// System.out.println("response.toString(): " + response.toString()); //打印响应头域信息 +// System.out.println("EntityUtils.toString(response.getEntity()): " + EntityUtils.toString(response.getEntity())); //打印响应消息实体 + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 构造请求Body体 + * + * @param sender + * @param receiver + * @param templateId + * @param templateParas + * @param statusCallbackUrl + * @param signature | 签名名称,使用国内短信通用模板时填写 + * @return + */ + static String buildRequestBody(String sender, String receiver, String templateId, String templateParas, + String statusCallbackUrl, String signature) { + if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty() + || templateId.isEmpty()) { + throw new JeroBootException("buildRequestBody(): sender, receiver or templateId is null."); + } + List keyValues = new ArrayList(); + + keyValues.add(new BasicNameValuePair("from", sender)); + keyValues.add(new BasicNameValuePair("to", receiver)); + keyValues.add(new BasicNameValuePair("templateId", templateId)); + if (null != templateParas && !templateParas.isEmpty()) { + keyValues.add(new BasicNameValuePair("templateParas", templateParas)); + } + if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) { + keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl)); + } + if (null != signature && !signature.isEmpty()) { + keyValues.add(new BasicNameValuePair("signature", signature)); + } + + return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8")); + } + + /** + * 构造X-WSSE参数值 + * + * @param appKey + * @param appSecret + * @return + */ + static String buildWsseHeader(String appKey, String appSecret) { + if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) { + throw new JeroBootException("buildWsseHeader(): appKey or appSecret is null."); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + String time = sdf.format(new Date()); //Created + String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce + + byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret); + String hexDigest = Hex.encodeHexString(passwordDigest); + + //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码 + String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); //PasswordDigest + //如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码 + //String passwordDigestBase64Str = Base64.encodeBase64String(hexDigest.getBytes(Charset.forName("utf-8"))); //PasswordDigest + //若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正 + //passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", ""); + + return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time); + } + +} \ No newline at end of file diff --git a/jero-boot-incoming-payment/pom.xml b/jero-boot-incoming-payment/pom.xml index bd3249df..a8b99383 100644 --- a/jero-boot-incoming-payment/pom.xml +++ b/jero-boot-incoming-payment/pom.xml @@ -33,7 +33,16 @@ spring-boot-starter-test test - + + com.google.zxing + core + 3.3.0 + + + com.google.zxing + javase + 3.3.0 + - select c.id,c.charge_project, c.charge_use, c.principal_id,c.principal_name,c.charge_company_temporary_name,c.receivable_amount,c.paid_amount,c.need_invoice,c.pack,c.in_account,c.make_invoice,c.mail,c.create_time,1 as projectType + select c.id,c.charge_project, c.charge_use, c.principal_id,c.principal_name,c.contacts_temporary_id,c.contacts_temporary_name,c.charge_company_temporary_name,c.receivable_amount,c.paid_amount,c.need_invoice,c.pack,c.in_account,c.make_invoice,c.mail,c.create_time,1 as projectType,'' as phone,'' as email from pay_common_project c @@ -22,7 +44,7 @@ UNION ALL - select gsub.id,g.working_group_project, gsub.charge_use, g.principal_id_a,g.principal_name_a,gsub.charge_company_temporary_name,gsub.receivable_amount,gsub.paid_amount,gsub.need_invoice,gsub.pack,gsub.in_account,gsub.make_invoice,gsub.mail,gsub.create_time,2 + select gsub.id,g.working_group_project, gsub.charge_use, g.principal_id_a,g.principal_name_a,gsub.contacts_temporary_id_one,gsub.contacts_temporary_name_one,gsub.charge_company_temporary_name,gsub.receivable_amount,gsub.paid_amount,gsub.need_invoice,gsub.pack,gsub.in_account,gsub.make_invoice,gsub.mail,gsub.create_time,2,'','' from pay_working_group g inner join pay_working_group_subitem gsub on g.id = gsub.charge_company_id @@ -38,7 +60,7 @@ UNION ALL - select sit.id,meeting.meeting_name,sit.charge_use, meeting.director_id, meeting.director_name,sit.company_name,sit.amount_receivable,sit.paid_amount,sit.need_invoice,sit.pack,sit.in_account,sit.make_invoice,sit.mail,sit.create_time,3 + select sit.id,meeting.meeting_name,sit.charge_use, meeting.director_id, meeting.director_name,sit.company_contact_temporary_id,sit.company_contact_name,sit.company_name,sit.amount_receivable,sit.paid_amount,sit.need_invoice,sit.pack,sit.in_account,sit.make_invoice,sit.mail,sit.create_time,3,'','' from pay_meeting meeting inner join pay_meeting_situation sit on meeting.id = sit.meeting_id @@ -54,7 +76,7 @@ UNION ALL - select msub.id,pmp.project_name,msub.charge_use,pmp.director_id,pmp.director_name,msub.company_name,msub.amount_receivable,msub.paid_amount,msub.need_invoice,msub.pack,msub.in_account,msub.make_invoice,msub.mail,msub.create_time,4 + select msub.id,pmp.project_name,msub.charge_use,pmp.director_id,pmp.director_name,msub.company_contact_temporary_id,msub.company_contact_name,msub.company_name,msub.amount_receivable,msub.paid_amount,msub.need_invoice,msub.pack,msub.in_account,msub.make_invoice,msub.mail,msub.create_time,4,'','' from pay_member_project pmp inner join pay_member_project_subitem msub on pmp.id = msub.project_id @@ -70,7 +92,7 @@ UNION ALL - select tmsub.id,tmember.project_name,tmsub.charge_use,'','',tmsub.company_name,tmsub.amount_receivable,tmsub.paid_amount,tmsub.invoice_requirements,tmsub.pack,tmsub.in_account,tmsub.make_invoice,tmsub.mail,tmsub.create_time,5 + select tmsub.id,tmember.project_name,tmsub.charge_use,'','','',tmsub.liaison_man,tmsub.company_name,tmsub.amount_receivable,tmsub.paid_amount,tmsub.invoice_requirements,tmsub.pack,tmsub.in_account,tmsub.make_invoice,tmsub.mail,tmsub.create_time,5,mobile,email from tb_member_project tmember inner join tb_member_project_subitem tmsub on tmember.id=tmsub.project_id @@ -84,12 +106,18 @@ AND tmember.year = #{year} - ) project ON project.id = ppcp.project_id + ) project + LEFT JOIN pay_pack_company_project ppcp ON project.id = ppcp.project_id + LEFT JOIN pay_pack_company ppc ON ppc.id = ppcp.pack_id and ppc.pack_year =#{packYear} + LEFT JOIN pay_contacts_management_temporary pcmt ON pcmt.id = project.contacts_temporary_id LEFT JOIN pay_payment_record ppr ON ppr.project_id = project.id + WHERE project.id IS NOT NULL AND project.id != '' + + AND ppcp.pack_id = #{packId} + AND DATE_FORMAT(ppr.payment_date,'%Y') = #{paymentDate} - WHERE project.id IS NOT NULL AND project.id != '' GROUP BY ppcp.project_id ORDER BY ppcp.create_time desc + \ No newline at end of file diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyProjectService.java b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyProjectService.java index 6117860e..b97758ed 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyProjectService.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyProjectService.java @@ -4,6 +4,7 @@ package com.jero.pack.service; import com.baomidou.mybatisplus.extension.service.IService; import com.jero.pack.entity.PayPackCompanyProject; import com.jero.pack.vo.PayPackCompanyProjectInput; +import com.jero.pack.vo.PayProjectExcel; import com.jero.project.entity.PayCommonProject; import java.util.List; @@ -32,7 +33,7 @@ public interface IPayPackCompanyProjectService extends IService queryPackListAll(PayPackCompanyProjectInput input); /** - * @Description + * @Description 打包 * @Author lqt * @Date 2021/9/10 * @Param @@ -69,4 +70,22 @@ public interface IPayPackCompanyProjectService extends IService queryPackToYear(String companyId,String projectType,String year); + /** + * @Description 添加打包企业 + * @Author lqt + * @Date 2021/9/13 + * @Param + * @Return + * @Exception + */ + void setPack(String companyId, String contactsId, String packYear, String projectId, String projectType, Integer pack); + /** + * @Description 导出excel数据 + * @Author lqt + * @Date 2021/9/13 + * @Param + * @Return + * @Exception + */ + List getExportXls(List list,String companyId); } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyService.java b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyService.java index 6d6210bb..2c703c19 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyService.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/IPayPackCompanyService.java @@ -5,6 +5,8 @@ import com.jero.pack.entity.PayPackCompany; import com.jero.pack.vo.PayPackCompanyProjectInput; import com.jero.project.entity.PayCommonProject; +import java.util.List; + /** * @Description: pay_pack_company * @Author: jeecg-boot @@ -20,7 +22,7 @@ public interface IPayPackCompanyService extends IService { * @Return * @Exception */ - void addPayPackCompany(PayPackCompany payPackCompany); + PayPackCompany addPayPackCompany(PayPackCompany payPackCompany); /** * @Description 编辑 * @Author lqt diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyProjectServiceImpl.java b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyProjectServiceImpl.java index 6f45778c..646a72ab 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyProjectServiceImpl.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyProjectServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jero.common.api.vo.Result; import com.jero.common.exception.JeroBootException; import com.jero.common.service.ProjectPackService; +import com.jero.contract.common.PayIncomeContractCommon; import com.jero.pack.common.PackCommon; import com.jero.pack.entity.PayPackCompany; import com.jero.pack.entity.PayPackCompanyProject; @@ -12,11 +13,13 @@ import com.jero.pack.mapper.PayPackCompanyProjectMapper; import com.jero.pack.service.IPayPackCompanyProjectService; import com.jero.pack.service.IPayPackCompanyService; import com.jero.pack.vo.PayPackCompanyProjectInput; +import com.jero.pack.vo.PayProjectExcel; import com.jero.project.entity.PayCommonProject; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -55,7 +58,7 @@ public class PayPackCompanyProjectServiceImpl extends ServiceImpl list = new ArrayList<>(); PayPackCompanyProjectInput input = new PayPackCompanyProjectInput(); input.setProjectId(s1); input.setCompanyId(payPackCompany.getCompanyId()); - List list = payPackCompanyProjectService.queryPackListAll(input); + list = payPackCompanyProjectService.queryPackListAll(input); if(CollectionUtils.isEmpty(list)){ throw new JeroBootException("项目下企业不匹配!"); } - payPackCompanyProject.setProjectType(list.get(0).getProjectType()); - payPackCompanyProject.setProjectId(s1); - payPackCompanyProject.setCome(PackCommon.COME2); - listPayPackCompanyProject.add(payPackCompanyProject); + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(PayPackCompanyProject::getProjectId,s1); + List listQuery = payPackCompanyProjectService.list(query); + if(!CollectionUtils.isEmpty(listQuery)){ + throw new JeroBootException("项目已打包!"); + } + PayPackCompanyProject payPackCompanyProjectNew = new PayPackCompanyProject(); + payPackCompanyProjectNew.setProjectType(list.get(0).getProjectType()); + payPackCompanyProjectNew.setProjectId(s1); + payPackCompanyProjectNew.setPackId(payPackCompanyProject.getPackId()); + payPackCompanyProjectNew.setCome(PackCommon.COME2); + listPayPackCompanyProject.add(payPackCompanyProjectNew); } LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.in(PayPackCompanyProject::getProjectId, Arrays.asList(payPackCompanyProject.getProjectIds())); @@ -94,7 +106,7 @@ public class PayPackCompanyProjectServiceImpl extends ServiceImpl{ projectPackService.updateProjectStatus(p.getProjectId(),String.valueOf(p.getProjectType()),String.valueOf(PackCommon.PACKAGING1),payPackCompanyProject.getPackId()); }); - payPackCompanyProjectService.save(payPackCompanyProject); + payPackCompanyProjectService.saveBatch(listPayPackCompanyProject); } } @@ -132,4 +144,40 @@ public class PayPackCompanyProjectServiceImpl extends ServiceImpl queryPackToYear(String companyId,String projectType,String year) { return payPackCompanyProjectMapper.queryPackToYear(companyId,projectType,year, PackCommon.COME2); } + + @Override + public void setPack(String companyId, String contactsId, String packYear, String projectId,String projectType, Integer pack) { + // 合同选择了打包,查看打包年份&&打包企业是否存在 + if(Objects.equals(pack, PackCommon.PACKAGING1)){ + LambdaQueryWrapper queryPayPackCompany = new LambdaQueryWrapper<>(); + queryPayPackCompany.eq(PayPackCompany::getCompanyId,companyId); + queryPayPackCompany.eq(PayPackCompany::getPackYear,packYear); + List listPayPackCompany = payPackCompanyService.list(queryPayPackCompany); + PayPackCompany payPackCompany = new PayPackCompany(); + //不存在打包企业 添加打包企业 + if(CollectionUtils.isEmpty(listPayPackCompany)){ + PayPackCompany payPackCompanyData = new PayPackCompany(); + payPackCompanyData.setCompanyId(companyId); + payPackCompanyData.setCompanyContactId(contactsId); + payPackCompanyData.setPackYear(packYear); + payPackCompanyData.setPackContactId(contactsId); + payPackCompany = payPackCompanyService.addPayPackCompany(payPackCompanyData); + }else{ + payPackCompany = listPayPackCompany.get(0); + } + // 添加打包企业成员 + PayPackCompanyProject payPackCompanyProject = new PayPackCompanyProject(); + payPackCompanyProject.setPackId(payPackCompany.getId()); + payPackCompanyProject.setProjectId(projectId); + payPackCompanyProject.setCome(PayIncomeContractCommon.COME1); + payPackCompanyProject.setProjectType(Integer.parseInt(projectType)); + payPackCompanyProjectService.save(payPackCompanyProject); + // projectPackService.updateProjectStatus(projectId,projectType,String.valueOf(PackCommon.PACKAGING1),payPackCompanyProject.getPackId()); + } + } + + @Override + public List getExportXls(List list,String companyId) { + return payPackCompanyProjectMapper.getExportXls(list,companyId); + } } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyServiceImpl.java b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyServiceImpl.java index 4bfa73be..9111d07f 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyServiceImpl.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/pack/service/impl/PayPackCompanyServiceImpl.java @@ -21,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Arrays; +import java.util.List; import java.util.Objects; /** @@ -43,7 +44,7 @@ public class PayPackCompanyServiceImpl extends ServiceImpl query = new LambdaQueryWrapper<>(); query.eq(PayPackCompany::getCompanyId,payPackCompany.getCompanyId()); @@ -58,6 +59,7 @@ public class PayPackCompanyServiceImpl extends ServiceImpl0 && <总金额(半满标志))*/ +// @Excel(name = "到账(1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志))", width = 15) + @ApiModelProperty(value = "到账(1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志))") + private Integer inAccount; + /**开票(1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志))*/ +// @Excel(name = "开票(1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志))", width = 15) + @ApiModelProperty(value = "开票(1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志))") + private Integer makeInvoice; + /**邮寄((1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志)))*/ +// @Excel(name = "邮寄((1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志)))", width = 15) + @ApiModelProperty(value = "邮寄((1:全额(对勾),0:0(X),2:>0 && <总金额(半满标志)))") + private Integer mail; + /**来款方式(1:无,2:合同,3:收费通知)*/ +// @Excel(name = "来款方式(1:无,2:合同,3:收费通知)", width = 15) + @ApiModelProperty(value = "来款方式(1:无,2:合同,3:收费通知)") + @NotNull(message = "需要发票不能为空!") + private Integer chargeWay; + /**合同编号*/ +// @Excel(name = "合同编号", width = 15) + @ApiModelProperty(value = "合同编号") + @Size(max = 50,message = "合同编号长度不能大于50个字符") + private String contractNum; + /**收费通知号*/ +// @Excel(name = "收费通知号", width = 15) + @ApiModelProperty(value = "收费通知号") + @Size(max = 50,message = "收费通知号长度不能大于50个字符") + private String chargeNoticeNo; + /**收费通知文件id*/ +// @Excel(name = "收费通知文件id", width = 15) + @ApiModelProperty(value = "收费通知文件id") + private String chargeNoticeId; + /**催款次数*/ +// @Excel(name = "催款次数", width = 15) + @ApiModelProperty(value = "催款次数") + private Integer pressMoneyTimes; + /**备注*/ +// @Excel(name = "备注", width = 15) + @ApiModelProperty(value = "备注") + @Size(max = 200,message = "备注长度不能大于200个字符") + private String remarks; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private String createBy; + /**创建时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private String updateBy; + /**更新时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + /** + * 项目类型(1:普通项目,2:工作组项目,3:会议项目,4:会员项目,5:标协会员项目) + */ + @TableField(exist = false) + @Dict(dicCode = "project_type") + @ApiModelProperty(value = "项目类型") + private Integer projectType; + /** + * 来源(1:收入合同,2:打包管理) + */ + @TableField(exist = false) + @ApiModelProperty(value = "来源(1:收入合同,2:打包管理)") + private Integer come; +} diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayCommonProjectController.java b/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayCommonProjectController.java index 0aa7272d..811f4cba 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayCommonProjectController.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/project/controller/PayCommonProjectController.java @@ -166,7 +166,7 @@ public class PayCommonProjectController extends JeroController{ // 去掉已打包&&打包年份不一致的数据 if(!CollectionUtils.isEmpty(finalListProject) && Objects.equals(p.getPack(),PayProjectCommon.PACKAGING1) - && finalListProject.contains(p.getId())){ + && !finalListProject.contains(p.getId())){ return; } listNew.add(p); diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/project/entity/PayCommonProject.java b/jero-boot-incoming-payment/src/main/java/com/jero/project/entity/PayCommonProject.java index 3bab39bb..835edc8b 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/project/entity/PayCommonProject.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/project/entity/PayCommonProject.java @@ -203,5 +203,16 @@ public class PayCommonProject implements Serializable { @TableField(exist = false) @ApiModelProperty(value = "来源(1:收入合同,2:打包管理)") private Integer come; - + /** + * 联系人电话 + */ + @TableField(exist = false) + @ApiModelProperty(value = "联系人电话") + private String phone; + /** + * 联系人邮箱 + */ + @TableField(exist = false) + @ApiModelProperty(value = "联系人邮箱") + private String email; } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayCommonProjectServiceImpl.java b/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayCommonProjectServiceImpl.java index 86dee4c4..a0dd278e 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayCommonProjectServiceImpl.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayCommonProjectServiceImpl.java @@ -7,12 +7,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jero.common.api.vo.Result; import com.jero.common.exception.JeroBootException; import com.jero.common.service.ProjectDetailService; +import com.jero.contract.common.PayIncomeContractCommon; import com.jero.contract.entity.PayIncomeContract; import com.jero.contract.entity.PayIncomeContractAssociated; import com.jero.contract.service.IPayIncomeContractAssociatedService; import com.jero.contract.service.IPayIncomeContractService; import com.jero.modules.system.entity.SysUser; import com.jero.modules.system.service.ISysUserService; +import com.jero.pack.service.IPayPackCompanyProjectService; import com.jero.project.common.PayProjectCommon; import com.jero.project.service.IPayCommonProjectService; import com.jero.project.entity.PayCommonProject; @@ -28,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -60,6 +63,8 @@ public class PayCommonProjectServiceImpl extends ServiceImpl update = new LambdaUpdateWrapper<>(); - update.eq(PayCommonProject::getId,payCommonProject.getId()); - update.set(PayCommonProject::getPack,PayProjectCommon.PACKAGING1); - payCommonProjectService.update(update); - // todo 缺少添加打包功能 + payPackCompanyProjectService.setPack(payCommonProject.getChargeCompanyId(),payCommonProject.getContactsId(),payIncomeContract.getPackYear(),payCommonProject.getId(),PayProjectCommon.PROJECT_TYPE1,payIncomeContract.getPack()); } } @@ -134,21 +146,27 @@ public class PayCommonProjectServiceImpl extends ServiceImpl update = new LambdaUpdateWrapper<>(); - update.eq(PayCommonProject::getId,payCommonProjectOld.getId()); - update.set(PayCommonProject::getPack,PayProjectCommon.PACKAGING1); - payCommonProjectService.update(update); - // todo 缺少添加打包功能 - } - setPayCommonProject(payCommonProject); // 先删除临时表企业信息,联系人信息,邮寄联系人信息 payCompanyManagementTemporaryService.removeById(payCommonProjectOld.getChargeCompanyTemporaryId()); diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupSubItemServiceImpl.java b/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupSubItemServiceImpl.java index e0fa98b1..be483b04 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupSubItemServiceImpl.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/project/service/impl/PayWorkingGroupSubItemServiceImpl.java @@ -12,7 +12,10 @@ import com.jero.company.entity.PayContactsManagement; import com.jero.company.service.IPayCompanyManagementService; import com.jero.company.service.IPayContactsManagementService; import com.jero.contract.entity.PayIncomeContract; +import com.jero.contract.entity.PayIncomeContractAssociated; +import com.jero.contract.service.IPayIncomeContractAssociatedService; import com.jero.contract.service.IPayIncomeContractService; +import com.jero.pack.service.IPayPackCompanyProjectService; import com.jero.project.common.PayProjectCommon; import com.jero.project.entity.PayCommonProject; import com.jero.project.entity.PayWorkingGroup; @@ -71,6 +74,10 @@ public class PayWorkingGroupSubItemServiceImpl extends ServiceImpl update = new LambdaUpdateWrapper<>(); - update.eq(PayWorkingGroupSubItem::getId,payWorkingGroupSubItem.getId()); - update.set(PayWorkingGroupSubItem::getPack,PayProjectCommon.PACKAGING1); - payWorkingGroupSubItemService.update(update); - // todo 缺少添加打包功能 + payPackCompanyProjectService.setPack(payWorkingGroupSubItem.getChargeCompanyId(),payWorkingGroupSubItem.getContactsIdOne(),payIncomeContract.getPackYear(),payIncomeContract.getId(),PayProjectCommon.PROJECT_TYPE2,payIncomeContract.getPack()); } } @@ -194,19 +210,26 @@ public class PayWorkingGroupSubItemServiceImpl extends ServiceImpl update = new LambdaUpdateWrapper<>(); - update.eq(PayWorkingGroupSubItem::getId,payWorkingGroupSubItem.getId()); - update.set(PayWorkingGroupSubItem::getPack,PayProjectCommon.PACKAGING1); - payWorkingGroupSubItemService.update(update); - // todo 缺少添加打包功能 + if(Objects.isNull(payIncomeContract)){ + PayIncomeContract payIncomeContractAdd = null; + // 来款方式为合同,校验合同编号 + if(Objects.equals(payWorkingGroupSubItem.getChargeWay(),PayProjectCommon.CHARGE_WAY2)){ + payIncomeContractAdd = payIncomeContractService.setPayIncomeContractAssociated(payWorkingGroupSubItem.getContractNum(),payWorkingGroupSubItem.getChargeCompanyId(),payWorkingGroupSubItem.getId()); + } + if(!Objects.isNull(payIncomeContract)){ + payWorkingGroupSubItem.setPack(PayProjectCommon.PACKAGING1); + PayIncomeContractAssociated payIncomeContractAssociated = new PayIncomeContractAssociated(); + payIncomeContractAssociated.setContractId(payIncomeContract.getId()); + payIncomeContractAssociated.setProjectType(Integer.parseInt(PayProjectCommon.PROJECT_TYPE1)); + payIncomeContractAssociated.setProjectId(payWorkingGroupSubItem.getId()); + payIncomeContractAssociatedService.save(payIncomeContractAssociated); + }else{ + payWorkingGroupSubItem.setPack(PayProjectCommon.PACKAGING0); + } + // 关联了合同,判断合同是否打包,更新项目打包状态,添加打包 + if(!Objects.isNull(payIncomeContractAdd) && Objects.equals(payIncomeContractAdd.getPack(),PayProjectCommon.PACKAGING1)){ + payPackCompanyProjectService.setPack(payWorkingGroupSubItem.getChargeCompanyId(),payWorkingGroupSubItem.getContactsIdOne(),payIncomeContract.getPackYear(),payWorkingGroupSubItem.getId(),PayProjectCommon.PROJECT_TYPE2,payIncomeContract.getPack()); + } } // 先删除临时表企业信息,联系人信息,邮寄联系人信息 diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/IMemberInfoService.java b/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/IMemberInfoService.java index 7ff1676a..949df9ad 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/IMemberInfoService.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/IMemberInfoService.java @@ -11,4 +11,5 @@ import com.jero.standards.memberinfo.entity.MemberInfo; */ public interface IMemberInfoService extends IService { + int check(String companyName); } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/impl/MemberInfoServiceImpl.java b/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/impl/MemberInfoServiceImpl.java index e027b156..f6c5c5be 100644 --- a/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/impl/MemberInfoServiceImpl.java +++ b/jero-boot-incoming-payment/src/main/java/com/jero/standards/memberinfo/service/impl/MemberInfoServiceImpl.java @@ -1,6 +1,7 @@ package com.jero.standards.memberinfo.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jero.standards.memberinfo.entity.MemberInfo; import com.jero.standards.memberinfo.mapper.MemberInfoMapper; @@ -20,4 +21,11 @@ import org.springframework.transaction.annotation.Transactional; @DS(value = "multi-datasource1") public class MemberInfoServiceImpl extends ServiceImpl implements IMemberInfoService { + @Override + public int check(String companyName) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MemberInfo::getCompanyName, companyName); + wrapper.isNotNull(MemberInfo::getMemberType); + return count(wrapper); + } } diff --git a/jero-boot-incoming-payment/src/main/java/com/jero/util/QrcodeUtil.java b/jero-boot-incoming-payment/src/main/java/com/jero/util/QrcodeUtil.java new file mode 100644 index 00000000..c039da3d --- /dev/null +++ b/jero-boot-incoming-payment/src/main/java/com/jero/util/QrcodeUtil.java @@ -0,0 +1,52 @@ +package com.jero.util; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.client.j2se.MatrixToImageConfig; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.jero.common.exception.JeroBootException; +import org.checkerframework.checker.units.qual.K; + +import java.io.ByteArrayOutputStream; +import java.util.Base64; + +/** + * 生成二维码base64工具类 + * @author liJiaRao + * @date 2021-07-15 10:15 + */ +public class QrcodeUtil { + /** + * 蓝色 + */ + public static final int BLUE = 0xFF23CEFD; + /** + * 蓝色 + */ + public static final int BLACK = 0xFF000000; + /** + * 白色透明 + */ + public static final int OFF_COLOR = 0x00FFFFFF; + /** + * 转换url为二维码base64 + * @param content 要转换的url + * @return base64 data:image/png;base64, + */ + public static String create(String content){ + try { + QRCodeWriter qrCodeWriter = new QRCodeWriter(); + BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 600, 600); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream, new MatrixToImageConfig(BLACK,OFF_COLOR)); + + Base64.Encoder encoder = Base64.getEncoder(); + + return "data:image/png;base64,"+encoder.encodeToString(outputStream.toByteArray()); + }catch (Exception e){ + throw new JeroBootException("生成二维码失败"); + } + } +} diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java index 11261181..1fb3d991 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SysRoleController.java @@ -3,16 +3,13 @@ package com.jero.modules.system.controller; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.util.StrUtil; import com.jero.common.exception.JeroBootException; import com.jero.common.system.vo.SysDepartTreeModel; import com.jero.common.system.vo.SysRoleTreeModel; @@ -35,6 +32,7 @@ import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -422,6 +420,7 @@ public class SysRoleController { @RequiresPermissions("sys:role:list") @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) public Result> queryTreeList(HttpServletRequest request) { + Result> result = new Result<>(); //全部权限ids List ids = new ArrayList<>(); @@ -433,6 +432,17 @@ public class SysRoleController { for(SysPermission sysPer : list) { ids.add(sysPer.getId()); } + String roleId = request.getParameter("roleId"); + if (StrUtil.isNotBlank(roleId)) { + SysRole sysRole = sysRoleService.getById(roleId); + String parentId = sysRole.getParentId(); + if (StrUtil.isNotBlank(parentId)) { + List sysRolePermissions = sysRolePermissionService.list(new QueryWrapper().lambda().eq(SysRolePermission::getRoleId, parentId)); + List collect = sysRolePermissions.stream().map(SysRolePermission -> String.valueOf(SysRolePermission.getPermissionId())).collect(Collectors.toList()); + list = list.stream().filter(p -> collect.contains(p.getId())).collect(Collectors.toList()); + } + } + List treeList = new ArrayList<>(); getTreeModelList(treeList, list, null); Map resMap = new HashMap(); diff --git a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java index 840225b3..0baec707 100644 --- a/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java +++ b/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysRoleServiceImpl.java @@ -120,7 +120,7 @@ public class SysRoleServiceImpl extends ServiceImpl impl treeModel.setKey(sysRole.getId()); treeModel.setValue(sysRole.getId()); treeModel.setTitle(sysRole.getRoleName()); - treeModel.setParentName(sysRole1.getRoleName()); + treeModel.setParentName(sysRole1==null?null:sysRole1.getRoleName()); List children = getChildrenByParentId(sysRole.getId()); treeModel.setChildren(children); treeModelList.add(treeModel); diff --git a/jero-boot-single-startup/src/main/resources/application-dev.yml b/jero-boot-single-startup/src/main/resources/application-dev.yml index 719bffb7..6bdf0082 100644 --- a/jero-boot-single-startup/src/main/resources/application-dev.yml +++ b/jero-boot-single-startup/src/main/resources/application-dev.yml @@ -299,6 +299,15 @@ justauth: prefix: 'demo::' timeout: 1h defaultPassword: HZWLsoft.com123 +#华为云发送短信 +huaWeiSms: + #APP接入地址+接口访问URI + url: https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1 + #APP_Key + appKey: g9zviC58Uw3qXZK6r56empl2aXP3 + appSecret: eGt7RfKNia8cK4Z3Vnw5QE4Uy108 + # 短信开关 + open: false standards: url: http://loaclhots:8081/api token: Aa123456!! \ No newline at end of file